gpt4 book ai didi

haskell - `mfix` 未按预期工作

转载 作者:行者123 更新时间:2023-12-02 11:43:08 26 4
gpt4 key购买 nike

我期望以下代码首先提示start:,然后等待用户响应,然后回显先前的用户响应,并等待新的响应:

import System.IO (hFlush, stdout)
import Control.Monad.Fix (mfix)

f :: [String] -> IO [String]
f = mapM $ \x -> putStr x >> putStr ": " >> hFlush stdout >> getLine

g x = f ("start":x)

main = mfix g

但在输入第一行后,它会给出错误线程在 MVar 操作中无限期阻塞

这是为什么?我该如何解决它(请原谅双关语)?

最佳答案

这不起作用的原因是在 mfix f 中,f 中的任何效果都只运行一次。这是从紧缩规则得出的

mfix (\x -> a >>= \y -> f x y)  =  a >>= \y -> mfix (\x -> f x y)

特别是

mfix (\x -> a >> f x)  =  a >> mfix f

任何正确的 MonadFix 实例。因此,仅针对一元 Action 内的纯(延迟计算)值计算固定点,而不是针对效果计算固定点。在您的情况下,使用 mfix 要求仅打印/读取字符一次,以使输入等于输出,这是不可能的。这不是 mfix 的正确用例。例如,您可以将 mfixIO 结合使用,在 IO 中构造循环数据结构,如 these examples 中所示。 .

在您的情况下,您应该使用 iterateM_或类似的东西而不是mfix。另请参阅iterate + forever = iterateM? Repeating an action with feedback .

关于haskell - `mfix` 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26635324/

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