据我所知,do
Haskell 中的块只是一元绑定运算符的某种语法糖。例如,可以转换
main = do f <- readFile "foo.txt"
print f
print "Finished"
to
main = readFile "foo.txt" >>= print >> print "Finished"
Can all do
块转换为绑定语法?例如,这个块怎么样?f
多次使用:
main = do f <- readFile "foo.txt"
print $ "prefix " ++ f
print $ f ++ " postfix"
假设我们在 IO monad 中,不可能简单地执行readFile
计算两次。这个示例(如果可能的话)如何仅使用绑定语法来表达?
我认为使用Control.Monad
没有解决方案,因为它内部使用do
blocks.
我认为可以使用箭头来表达这一点(使用&&&
) -- 也许这是一种只能使用箭头的情况单子的概括?
请注意,这个问题不是关于上面的特殊示例,而是关于在单元表达式中多次使用计算结果的一般情况,例如print
.
是的,都可以转换为bind语法;事实上,它们是由编译器内部转换的。
我希望您的示例的翻译能给您带来提示:
main = readFile "foo.txt" >>= \f ->
(print $ "prefix " ++ f) >>
(print $ f ++ " postfix")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)