据我所知,do
Haskell 中的块只是单子绑定运算符的某种语法糖。例如,可以转换
main = do f <- readFile "foo.txt"
print f
print "Finished"
至
main = readFile "foo.txt" >>= print >> print "Finished"
所有do
块都可以转换为绑定语法吗?例如,这个块在哪里f
被多次使用:
main = do f <- readFile "foo.txt"
print $ "prefix " ++ f
print $ f ++ " postfix"
假设我们在 IO monad 中,不可能简单地执行readFile
两次计算。这个例子(如果可能的话)如何只使用绑定语法来表达?
我认为 usingControl.Monad
不是解决方案,因为它在内部使用do
块。
我认为可以使用箭头(使用&&&
)来表达这一点——也许这是只有箭头可以用作monads 的概括的情况?
请注意,这个问题不是关于上面的特殊示例,而是关于在 monadic 表达式中多次使用计算结果的一般情况print
。