我正在尝试使用 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 中,函数定义不能交错。问题是您部分定义了
roll
,然后定义了 rollR
,然后再次返回到 roll
。相反,首先将滚动的所有定义分组:
roll Die6 times = ...
roll Die4 times = ...
rollR Die6 times first last = ...
rollR Die4 times first last = ...