我正在尝试创建一个返回2个整数列表的函数worp。
如果第一个整数列表是8减去输入列表长度的结果,则掷骰子。
第二个列表是输入列表。
这是我的代码:
import System.Random
worp :: [Int] -> [[IO Int]]
worp d = [werpDobbelstenen (8-length d),d]
werpDobbelstenen :: Int -> [IO Int]
werpDobbelstenen 0 = []
werpDobbelstenen x = randomRIO (1,6):werpDobbelstenen x-1
我收到此错误:
System.IO> :load "X:\\haskell\\dobbel.hs"
ERROR file:.\dobbel.hs:17 - Instance of Num [IO Int] required for definitio of werpDobbelstenen
答案 0 :(得分:1)
首先,为简单起见,我会返回IO [Int]
值:
import Control.Monad -- replicateM
import System.Random -- randomRIO
werpDobbelstenen :: Int -> IO [Int]
werpDobbelstenen n = replicateM n (randomRIO (1,6))
现在,更简单地定义您的worp
,简单地定义一个Int
列表并返回所需的列表对。
worp' :: [Int] -> ([Int], [Int])
worp' d = (d, map (\x -> x - length d) d)
最后,您只需将worp
映射到werpDobbelstenen
的结果上即可获得IO ([Int], [Int])
值。
worp :: Int -> IO ([Int], [Int])
worp n = fmap worp' (werpDobbelstenen n)
经过一番思考,我认为这就是你想要的:
import Control.Monad -- replicateM
import System.Random -- randomRIO
werpDobbelstenen :: Int -> IO [Int]
werpDobbelstenen n = replicateM n (randomRIO (1,6))
worp' :: [Int] -> IO ([Int], [Int])
worp' d = let n = 8 - length d
in do d' <- werpDobbelstenen n
return (d, d')
worp :: Int -> IO ([Int], [Int])
worp n = werpDobbelstenen n >>= worp'
>>> worp 6
([4,1,2,5,6,4],[1,2])
在这种情况下,元组的第二个值始终是n >= 8
的空列表。您可能希望对大于8的值执行不同的操作。