gpt4 book ai didi

haskell - 如何在函数中使用 getStdGen

转载 作者:行者123 更新时间:2023-12-03 13:50:28 32 4
gpt4 key购买 nike

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

import System.Random  

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

但是,当我尝试在函数中使用它时,它会失败(即)
genrandTF:: Int -> StdGen -> [Bool]
genrandTF number gen = take number (randomRs (True, False) 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)

当我将其更改为输入 IO StdGen 时,我收到以下消息时无法编译:
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)

最佳答案

这是初学者常犯的错误。 getStdGen是一个类型为 IO StdGen 的值;换句话说,它不是 StdGen而是一个计算机程序,当它完成时,它将包含一些 Haskell 可以用作 StdGen 的东西。 .

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

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

fmap (genrandTF 20) getStdGen

它使用 Functor IO 的实例.

关于haskell - 如何在函数中使用 getStdGen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897414/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com