haskell - 将 IO 输出到另一个纯 Haskell 函数

标签 haskell io

<分区>

我是 Haskell 的新手,英语也不是我的母语,所以请不要因为打字错误或问题表述不当而给这篇文章打分:对我来说,这是一场真正的斗争。

无论如何:我正在尝试生成随机坐标(Int,Int),然后在另一个Haskell 函数中使用它。但是我在将 IO 函数结果“导出”到第二个纯类 Haskell 函数时遇到了一些问题。

这是我认为并希望能正确说明我的问题的一个例子:

genRandomPair = genRandNr

genRandNr :: IO (Int,Int)
genRandNr = do
    firstRandom <- randomRIO (1,10)
    secondRandom <- randomRIO (1,10)
    return (firstRandom,secondRandom)

如果不是很明显,那是我的问题是从 genRandNrgenRandomPair 的越界。

非常感谢所有友好的输入。

请注意:非常高级的代码和解释不会真正帮助我,因为我处于初学者水平,直到一周前才在 Haskell 中使用过 monads 或 IO。

最佳答案

如果你有一个 IO (Int,Int) 值和一个接受 (Int,Int) 的函数,你可以使用 fmap 通过纯函数映射不纯结果:

fmap myPureFunction anImpureTuple

不过,一般来说,您可能想要 factor out the non-deterministic part你的代码。

我知道您是 Haskell 的新手,但不幸的是,Haskell 中的随机性可能不是一个好的初学者主题。 Haskell 明确区分纯函数和不纯 Action ,随机性在本质上是不纯的。

要对依赖于随机性的函数进行优雅的分解,需要了解 Haskell 的一些中间抽象,例如仿函数(在 fmap 的情况下)或类型类(以了解 RandomGen)。

关于haskell - 将 IO 输出到另一个纯 Haskell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66316461/

相关文章:

haskell - 使用 `at` 和 `ix` 组合镜头

haskell - 使用StateT s IO a的内存泄漏在哪里?

java - 保持 Stream 打开有什么问题?

java - 传输文件的协议(protocol)

javascript - 使用 Node.js 删除文本文件的前 15k 行

java - Java 中的缓冲区大小

haskell - 如何使用镜头库编写依赖于其他镜头的复杂镜头?

haskell - Haskell 中是否有通配符类型变量?

haskell - 交换函数的意外性质?

c++ - aio_read 和 read/EWOULDBLOCK 有什么区别?