gpt4 book ai didi

haskell - 使用 getChar 重新实现 getContents

转载 作者:行者123 更新时间:2023-12-04 14:40:49 26 4
gpt4 key购买 nike

在我在 Haskell 中掌握惰性 IO 的过程中,我尝试了以下方法:

main = do
chars <- getContents
consume chars

consume :: [Char] -> IO ()
consume [] = return ()
consume ('x':_) = consume []
consume (c : rest) = do
putChar c
consume rest

它只是回显在标准输入中输入的所有字符,直到我点击“x”。

所以,我天真地认为应该可以重新实现 getContents使用 getChar按照以下方式做一些事情:
myGetContents :: IO [Char]
myGetContents = do
c <- getChar
-- And now?
return (c: ???)

事实证明它不是那么简单,因为 ???需要 IO [Char] -> [Char] 类型的函数这会 - 我认为 - 打破 IO monad 的整个想法。

检查 getContents 的执行情况(或者更确切地说 hGetContents )揭示了肮脏的 IO 东西的整个香肠工厂。我的假设是否正确 myGetContents如果不使用脏代码(即破坏单子(monad)的代码)就无法实现?

最佳答案

你需要一个新的原语 unsafeInterleaveIO :: IO a -> IO a延迟其参数 Action 的执行,直到该 Action 的结果被评估。然后

myGetContents :: IO [Char]
myGetContents = do
c <- getChar
rest <- unsafeInterleaveIO myGetContents
return (c : rest)

关于haskell - 使用 getChar 重新实现 getContents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950764/

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