getLine >>= \_ -> getLine >>= putStr
它进行了合理的操作,要求两次输入字符串,然后打印最后一次输入。由于编译器无法确定getLine
有什么外部影响,必须执行这两个操作,即使我们抛弃第一个操作的结果。
我需要将IO单子包装到另一个单子M中,以便IO计算仅在其返回值被使用时有效。因此,上面的程序可以重写为以下内容-
runM $ lift getLine >>= \_ -> lift getLine >>= lift putStr
在哪里
runM :: M a -> IO a
lift :: IO a -> M a
用户仅被要求输入一次。
然而,我无法弄清如何编写这个Monad以达到我想要的效果。我不确定它是否可能。请有人帮忙吗?
m>>=f
具有以下行为 - 评估f _|_
,并查看结果是否不是_|_
。如果是,则该结果即为答案。否则,结果为m>>=f
。但我不确定是否涵盖了所有情况。那么如何与_|_
进行比较呢?使用 try catch 吗? - Anupam Jainlift getLine >>= \s -> lift getLine >> putStr s
。 - rampion