Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:TCO和惰性评估_Haskell_Lazy Evaluation_Tail Call Optimization - Fatal编程技术网

Haskell:TCO和惰性评估

Haskell:TCO和惰性评估,haskell,lazy-evaluation,tail-call-optimization,Haskell,Lazy Evaluation,Tail Call Optimization,我试图理解为什么第一个main在c无效时不终止,而第二个则终止。根据描述 main只是一个未经评估的thunk,执行只是在构建数据结构。我试图在这里应用相同的原理,看看为什么第一个main没有终止。如果有人能帮我理解这一部分,或者给我一些理解这一部分的建议,那就太好了。除此之外,为什么GHCI不能将其视为TCO?这不符合定义吗 main = loop wh

我试图理解为什么第一个
main
c
无效时不终止,而第二个则终止。根据描述
main
只是一个未经评估的thunk,
执行
只是在构建数据结构。我试图在这里应用相同的原理,看看为什么第一个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
main=loop
哪里
循环=do
c返回()
只需b->打印b
打印c
环
>main::IO()
>主=回路
>在哪里
>循环=do
>案例验证
>无->返回()
>只要做
>打印b
>环路

谢谢。

尾部呼叫优化与此行为无关。问题很简单,第一个代码包含无限循环,而第二个代码不包含无限循环

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

def循环():
c=getChar()
如果有效,c:
做某事
其他:
做点别的事
印刷品(c)
循环()
后者类似于:

def循环():
c=getChar()
如果有效,c:
做某事
其他:
做点别的事
印刷品(c)
循环()
请注意,在后一种情况下,对
loop()
的调用位于分支
else
内部,而在前一种情况下,它位于外部,因此在每次
循环
调用时都会被调用

还要注意,Haskell中的
return
不会终止函数调用。这只是一个有一定价值且没有副作用的
IO
操作

例如:

main = do
    c <- return 1
    print c
main=do

c尾部调用优化与此行为无关。问题很简单,第一个代码包含无限循环,而第二个代码不包含无限循环

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

def循环():
c=getChar()
如果有效,c:
做某事
其他:
做点别的事
印刷品(c)
循环()
后者类似于:

def循环():
c=getChar()
如果有效,c:
做某事
其他:
做点别的事
印刷品(c)
循环()
请注意,在后一种情况下,对
loop()
的调用位于分支
else
内部,而在前一种情况下,它位于外部,因此在每次
循环
调用时都会被调用

还要注意,Haskell中的
return
不会终止函数调用。这只是一个有一定价值且没有副作用的
IO
操作

例如:

main = do
    c <- return 1
    print c
main=do

c您意识到这只是一个库函数,其工作原理与过程语言中的
return
关键字大不相同?@leftaroundabout:意识到这一点“有点”不正确,因为我正在点击“POST”,然后立即看到了这条评论。谢谢。除了接受答案,没有办法“结束”一个问题吗?如果是这样,我需要等待一段时间才能接受答案。将阅读stackoverflow文档。现在,要接受,我还要再等7分钟:-)。@user3169543不急于接受答案。投票选出你认为有用的答案,然后回来,说明天,然后接受你认为最好的答案。提前接受意味着你不太可能收到非常好的答案,因为回答者可能对问题失去兴趣,而且第一个答案通常可能不像下面的答案那样正确(或一样正确)或完整(或一样完整)。你意识到这只是一个库函数,并且与过程语言中的
return
关键字有很大不同?@leftaroundabout:当我点击“POST”时,意识到关于这一点的“某物”不正确,然后立即看到了这条评论。谢谢。除了接受答案,没有办法“结束”一个问题吗?如果是这样,我需要等待一段时间才能接受答案。将阅读stackoverflow文档。现在,要接受,我还要再等7分钟:-)。@user3169543不急于接受答案。投票选出你认为有用的答案,然后回来,说明天,然后接受你认为最好的答案。提前接受意味着你不太可能得到很好的答案,因为回答者可能会对问题失去兴趣,而且第一个答案可能不像下面的答案那样正确(或一样正确)或完整(或一样完整)。