Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell列表中的随机元素_Haskell - Fatal编程技术网

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