如何在Haskell中获得8-x随机值?

时间:2016-10-31 15:36:51

标签: haskell

我正在尝试创建一个返回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

1 个答案:

答案 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的值执行不同的操作。