我编写了一个 Haskell 函数,它计算给定列表中每个数字的阶乘并将其打印到屏幕上。
factPrint list =
if null list
then putStrLn ""
else do putStrLn ((show.fact.head) list)
factPrint (tail list)
该功能有效,但我发现第三行有点困惑。
为什么编译器(GHC)没有报告错误,因为在“putStrLn”(准?)函数之前没有“do”?
如果我从第4行省略了“做”,则按预期方式弹出错误。
我对 Haskell 及其方式很陌生,所以如果我说了一些过于愚蠢的话,请原谅我。
最佳答案
do putStrLn ((show.fact.head) list)
factPrint (tail list)
实际上是另一种写作方式
putStrLn ((show.fact.head) list) >> factPrint (tail list)
反过来,这意味着
putStrLn ((show.fact.head) list) >>= \_ -> factPrint (tail list)
do
表示法是将这些monad串在一起的便捷方法,而无需使用其他丑陋的语法。如果您在
do
中只有一个语句,那么您没有将任何东西串在一起,并且 do
是多余的。关于haskell - Haskell 的 "do"问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1593232/