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不急于接受答案。投票选出你认为有用的答案,然后回来,说明天,然后接受你认为最好的答案。提前接受意味着你不太可能得到很好的答案,因为回答者可能会对问题失去兴趣,而且第一个答案可能不像下面的答案那样正确(或一样正确)或完整(或一样完整)。