gpt4 book ai didi

haskell - 如何从 Haskell 中的 IO 操作中获取正常值

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

我有以下功能:

get :: Chars -> IO Chars
get cs = do
char <- getChar
let (dats, idx) = (curData cs, curIndex cs)
let (x,y:xs) = splitAt idx dats
let replacement = x ++ (ord char) : xs
return $ Chars replacement idx
我想得到一个 Chars从中获得值(value),而不是 IO行动。我不知道如何做到这一点,或者是否有可能。 Chars type 基本上只是一个容器:
data Chars = Chars {
curData :: [Int],
curIndex :: Int
-- etc.
}
细节不是那么重要,我只是想知道这个函数是否有办法返回 Chars而不是 IO Chars .
如果不是,我如何将其作为参数传递给接受 Chars 的函数?我对 Haskell I/O 有点陌生,但我认为我不希望我的所有函数都采用 Chars作为参数改为必须采用 IO Chars作为参数,然后提取并重新打包它们。似乎没有必要。
谢谢!

最佳答案

你不能,因为那会违反 referential transparency .

Haskell 中的 IO 以这种方式精确区分其结果和效果可能会因与环境/用户的交互而变化的操作和当您使用相同的输入参数调用它们时其结果不会改变的纯函数。

为了将结果传递给采用 Chars 的纯函数在输入中,您必须将您的 IO 操作调用到另一个 IO 操作中,将结果与 <- 绑定(bind)运算符到变量并将其传递给您的纯函数。伪代码示例:

myPureFunction :: Chars -> ...

otherAction :: Chars -> IO ()
otherAction cs = do
myChars <- get cs
let pureResult = myPureFunction myChars
...

如果你是 haskell 的 IO 新手,你不妨看看 Learn You a Haskell for a Great Good! 中的输入和输出章节。和 Real World Haskell .

实际上有一种方法可以简单地从 IO 操作中获取纯值,但在您的情况下,您不应该这样做,因为您正在与环境交互:只有当您可以保证自己是不违反引用透明度。

关于haskell - 如何从 Haskell 中的 IO 操作中获取正常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11467066/

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