为什么我无法在 Haskell Typeclass 中进行模式匹配?

问题描述 投票:0回答:1

我正在尝试使用 Haskell 中的代数数据类型 Die,使用以下定义定义

data Die = Die6 | Die4 | Die20 | Die100

我定义了以下类型类

class Roll a where
  roll :: (RandomGen g) => a -> Int -> g -> ([Int], g)
  rollR :: (RandomGen g) => a -> Int -> Int -> Int -> g -> ([Int], g)

instance Roll Die where
  roll Die6 times = generateIntRandomsArray 1 6 times
  rollR Die6  times first last = generateIntRandomsArray first last times
  {--
  roll Die4 times = generateIntRandomsArray 1 4 times (mkStdGen 4)
  rollR Die4 times first last = generateIntRandomsArray first last times (mkStdGen 4)
  --}

如果我在实例中只包含 rollDie6 和 rollRDie6,一切都很好,但是当我尝试包含 Die4 时,我会收到以下错误:

DieRoller.hs:16:3: error:
    Conflicting definitions for ‘roll’
    Bound at: DieRoller.hs:16:3-6
              DieRoller.hs:18:3-6
   |
16 |   roll Die6 times = generateIntRandomsArray 1 6 times
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...

DieRoller.hs:17:3: error:
    Conflicting definitions for ‘rollR’
    Bound at: DieRoller.hs:17:3-7
              DieRoller.hs:19:3-7
   |
17 |   rollR Die6  times first last = generateIntRandomsArray first last times
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...

我不明白这一点。我想根据骰子有 4 面或 6 面来定义不同的行为,但看起来我遗漏了一些东西。你能帮助我吗 ?谢谢 。只是为了给您提供更多信息,generateIntRandomsArray 有以下定义:

generateIntRandomsArray :: (Eq a, Random a, Num a, RandomGen g) => a -> a -> a -> g -> ([a], g)
generateIntRandomsArray start end = generate
    where generate 0 generator = ([], generator)
          generate numberElements generator =
              let (value, newGenerator) = randomR (start,end) generator
                  (restOfList, finalGenerator) = generate (numberElements-1) newGenerator
              in  (value:restOfList, finalGenerator)
haskell typeclass
1个回答
1
投票

在 haskell 中,函数定义不能交错。问题是您部分定义了

roll
,然后定义了
rollR
,然后再次返回到
roll
。相反,首先将滚动的所有定义分组:

roll Die6 times = ...
roll Die4 times = ...

rollR Die6 times first last = ...  
rollR Die4 times first last = ...
© www.soinside.com 2019 - 2024. All rights reserved.