Haskell:TCO 和惰性评估

Haskell: TCO and Lazy evaluation

我试图理解为什么第一个 mainc 无效时不终止,而第二个终止。从描述 here main 只是一个未计算的 thunk,而 executing 它只是在构建数据结构。我试图在这里应用相同的原则,看看为什么第一个 main 没有终止。如果有人可以帮助我理解这部分,或者给我一些理解这部分的指导,那就太好了。除此之外,为什么 GHCI 无法将其识别为 TCO?不符合定义?

main = loop                                                                     
  where                                                                         
   loop =  do                                                                   
     c <- getChar                                                               
     case valid c of                                                            
       Nothing -> return ()                                                     
       Just b  -> print b                                                       
     print c                                                                    
     loop                                                                       

> main :: IO ()
> main = loop
>   where
>   loop =  do
>     c <- getChar
>     case validate c of
>       Nothing -> return ()
>       Just b  -> do
>         print b
>         loop

谢谢。

尾调用优化与此行为没有任何关系。问题很简单,第一个代码包含一个无限循环,而第二个则没有。

您的第一个代码类似于命令式(python):

def loop():
    c = getChar()
    if valid c:
        do_something()
    else:
        do_something_else()

    print(c)
    loop()

而后者类似于:

def loop():
    c = getChar()
    if valid c:
        do_something()
    else:
        do_something_else()
        print(c)
        loop()

请注意,在后一种情况下,对 loop() 的调用是如何在 内部 分支 else 而在前者中,它是 外部 因此在每次 loop 调用时被调用。

另请注意 Haskell 中的 return 不会 终止函数调用。只是一个IO的动作,有一定的价值,没有副作用。

例如:

main = do
    c <- return 1
    print c

在上面的代码中,return 不会 阻止 print.

的输出