Haskell:TCO 和惰性评估
Haskell: TCO and Lazy evaluation
我试图理解为什么第一个 main
在 c
无效时不终止,而第二个终止。从描述 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
.
的输出
我试图理解为什么第一个 main
在 c
无效时不终止,而第二个终止。从描述 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
.