我不知道单子中的递归。来自haskell.org的维基是一个例子:递归单子
main = f 3
f 0 = return []
f n = do v <- getLine
vs <- f (n-1)
return $! v : vs
这个程序从标准输入中递归地获取三行。我无法理解的是,当你到达f 0以及递归如何展开时会发生什么。 do块的最终值如何构建?为什么在递归中重复调用最终返回行?我知道返回不是函数返回,如命令式语言,但我不明白这条线是如何重复的。
我知道这是一个原始的初学者问题,但我很难过。
在纸上,尝试用f的定义替换'vs < - f(n-1)'中的'f',直到完全展开为止。 – Squidly 2014-11-21 13:03:06
顺便说一句,如果'$!'是'seq',它的使用看起来毫无意义,因为'v:vs'已经处于弱头标准形式。 – chi 2014-11-21 13:19:22