Haskell 调用预期类型的方程时出错

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

我正在执行以下对 haskell 方法的调用

rollD6 ::  (RandomGen g, Int a) => Int -> ([a], g)
rollD6 times =  roll Die6 times (mkStdGen 6)

rollD6InRange :: (RandomGen g, Int a) => Int -> Int -> Int -> ([a], g)
rollD6InRange times start end = rollR Die6 times start end (mkStdGen 6)

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
  roll Die4 times = generateIntRandomsArray 1 4 times
  roll Die20 times = generateIntRandomsArray 1 20 times
  roll Die100 times = generateIntRandomsArray 1 100 times

  rollR Die6  times first last = generateIntRandomsArray first last times
  rollR Die4 times first last = generateIntRandomsArray first last times
  rollR Die20 times first last = generateIntRandomsArray first last times
  rollR Die100 times first last = generateIntRandomsArray first last times

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)

我收到以下错误

src/Merp/Die/Boundary/RollADie.hs:11:26:错误: • 预期类型为“* -> Constraint”,但“Int”具有类型“*” • 在类型签名中: rollD6 :: (RandomGen g, Int a) => Int -> ([a], g) | 11 | 11 rollD6 :: (RandomGen g, Int a) => Int -> ([a], g) |
^^^^^

src/Merp/Die/Boundary/RollADie.hs:14:32:错误: • 预期类型为“* -> Constraint”,但“Int”具有类型“*” • 在类型签名中: rollD6InRange :: (RandomGen g, Int a) => Int -> Int -> Int -> ([a], g) | 14 | 14 rollD6InRange :: (RandomGen g, Int a) => Int -> Int -> Int -> ([a], g) | ^^^^^

我一直在研究调用的参数,但我一直无法弄清楚发生了什么。你能告诉我还剩下什么吗?

haskell random typeclass
1个回答
0
投票

Int
不是类型类,所以:

rollD6 :: (RandomGen g, Int a) => Int -> ([a], g)
rollD6 times = roll Die6 times (mkStdGen 6)

没有多大意义:你用

a
代替
Int
,所以:

rollD6 :: RandomGen g => Int -> ([Int], g)
rollD6 times = roll Die6 times (mkStdGen 6)

同样适用于

rollD6InRange

© www.soinside.com 2019 - 2024. All rights reserved.