Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 如何在函数中使用getStdGen_Haskell_Random - Fatal编程技术网

Haskell 如何在函数中使用getStdGen

Haskell 如何在函数中使用getStdGen,haskell,random,Haskell,Random,我是haskell的新手,尤其是Random类型,当我遇到这个问题时,我正在浏览learnyouahaskell教程 import System.Random main = do gen <- getStdGen putStr $ take 20 (randomRs ('a','z') gen) 并通过 genrandTF 20 getStdGen 为什么呢 -更新- 我得到的错误是 <interactive>:116:15: Cou

我是haskell的新手,尤其是Random类型,当我遇到这个问题时,我正在浏览learnyouahaskell教程

import System.Random  

main = do  
    gen <- getStdGen  
    putStr $ take 20 (randomRs ('a','z') gen) 
并通过

genrandTF 20 getStdGen
为什么呢

-更新-

我得到的错误是

<interactive>:116:15:
    Couldn't match expected type `StdGen' with actual type `IO StdGen'
    In the second argument of `genrandTF', namely `(getStdGen)'
    In the expression: genrandTF 20 (getStdGen)
来自
randomR
(该
randomRs
在内部使用):

如果lo>hi会发生什么,这是未知数

(在
randomR(lo,hi)
中调用时


现在
True>False
,因此您在这里遇到了未指定的行为。请尝试使用
(False,True)
(除了修复与
IO
相关的错误外)这是初学者的一个常见错误。
getStdGen
是一个类型为
IO StdGen
的值;换句话说,它不是一个
StdGen
,而是一个计算机程序,当它完成时,将包含Haskell可以用作
StdGen
的内容

您需要运行该程序以获取
StdGen
(通过
unsafePerformIO
——顾名思义,这会破坏Haskell中的几个安全保证),或者您需要将该函数与该程序组合以生成一个新程序。(习惯上,Haskell I/O是一组与I/O操作交错的Haskell操作。)

做你想做的事情最简单的方法是:

fmap (genrandTF 20) getStdGen

它使用
Functor
实例来执行
IO

您需要发布错误消息。您可以提供您正在键入的内容和您正在查看的内容的副本并粘贴吗?
getStdGen
具有type
IO StdGen
,但您使用它时,就好像它具有type
StdGen
一样。您需要阅读更多关于m的信息onads.更新了问题--尝试使用IO标准,但不起作用谢谢!起作用了,但我假设这不会返回[Bool]类型?是否有任何可能的方法将其转换回[Bool]?它会给您一个
IO[Bool]
,即一个程序,当它完成时,将包含Haskell可以用作
[Bool]
的内容。通常,如果没有
unsafePerformIO
,您无法“转义”此IO包装(因为转义它在许多情况下本质上会使引用透明性无效),但您可以使用运算符
(>>=)将任意Haskell代码放入IO包装器中::IO x->(x->IO y)->IO y
(它需要一个生成x的程序和一个Haskell函数从x到生成y的程序,并将它们编织到一个生成y的程序中)。这就是
做的方式
-记谱法的工作方式。这并不能回答问题。这回答了作者在解决问题后可能会提出的问题。如果你对一个不是答案的问题有什么要说的,请将其作为评论发布。@Cubic:当然,你是对的-我在没有检查实际答案的情况下键入了这个答案问题是(当提供的唯一信息是“这失败了”时,但这不是一个好借口)。啊,好吧,我会让它保持下去,希望它能带来一些好处。
No instance for (RandomGen (IO StdGen))
  arising from a use of `randomRs'
In the second argument of `take', namely
  `(randomRs (True, False) gen)'
In the expression: take number (randomRs (True, False) gen)
In an equation for `genrandTF':
    genrandTF number gen = take number (randomRs (True, False) gen)
fmap (genrandTF 20) getStdGen