Haskell列表中的随机元素
我试图从列表中获取一个随机整数,但我遇到了一些问题,因为我们唯一允许使用的库是Haskell列表中的随机元素,haskell,Haskell,我试图从列表中获取一个随机整数,但我遇到了一些问题,因为我们唯一允许使用的库是QuickCheck、GHC.IO和Data.list 到目前为止,我通过以下方法获得了一个随机IO Int: ran :: Gen Int ran = choose (0,3) (列表的长度为4) 但是当我打电话的时候 elem = list !! generate ran 我得到:无法将预期类型“Int”与实际类型“IO Int”匹配。 我很确定你不能从IO Int中只提取Int,所以我有点迷路了 ?有什么想
QuickCheck
、GHC.IO
和Data.list
到目前为止,我通过以下方法获得了一个随机IO Int:
ran :: Gen Int
ran = choose (0,3)
(列表的长度为4)
但是当我打电话的时候
elem = list !! generate ran
我得到:无法将预期类型“Int”与实际类型“IO Int”匹配。
我很确定你不能从IO Int中只提取Int,所以我有点迷路了
?有什么想法吗?你可以使用
fmap
,这样elem
就是IO Int
:
elem :: IO Int
elem = fmap (list !!) (generate ran)
例如,使用另一个名称可能更好,因为Prelude
已经包含elem
函数。例如,randElem
:
randElem :: IO Int
randElem = (list !!) <$> generate ran
randElem::IO Int
randElem=(list!!)generate ran
,也就是说,我建议使用与elem
不同的名称,因为这是Prelude中函数的名称。@Andreway:是的,确实更新了!谢谢你的回答!不幸的是,这不起作用。我的列表是这样的:list:[Mov]
其中Mov:(Int,Int)
当我这样做时,我得到:无法将类型'IO Mov'与'(Int,Int)
更准确地说,list=[(3,3)、(3,2)、(2,3)、(2,2)]匹配,在这种情况下,您需要将IO Int
类型调整为IO ElementOfListType
,这就是IO(Int,Int)
。
randElem :: IO Int
randElem = (list !!) <$> generate ran