【发布时间】:2016-01-20 13:16:21
【问题描述】:
这是我无法回答的一项家庭作业中的一个问题。通过演示 Haskell 编译器(解释器?)如何执行程序来推理 Haskell 代码。
我被赋予了几个不同的功能......
-- built-in
take :: Int -> [a] -> [a]
take 0 _ = []
take n (x:xs) = x : (take (n - 1) xs)
-- exchanging entries
exchange :: [a] -> [a]
exchange [x,y] = [y,x]
exchange (x:y:xs) = (y:x:(exchange xs))
-- picking even numbered entries
evens :: [a] -> [a]
evens [x,y] = [x]
evens (x:_:xs) = x:(evens xs)
-- first four numbers repeated
first_four :: [Int]
first_four = 1:2:3:4:first_four
现在我必须通过“假装自己是编译器”来展示对惰性求值的理解。通过分解该语句的执行方式...
> take 5 (evens (exchange first_four))
[2,4,2,4,2]
我得到了前几行来帮助开始......
take 5 (evens (exchange first_four)) =
take 5 (evens (exchange (1:2:3:4:first_four))) =
take 5 (evens (2:1:(exchange (3:4:first_four)))) =
...
我需要一些帮助来了解惰性评估的工作原理,以便我可以回答这个问题。
【问题讨论】:
-
在来这里之前,您是否尝试过阅读网上已有的众多资源?
-
@BartekBanachewicz 是的
-
我曾经在这里为一个 Haskell 函数写了一个详细的评估链:stackoverflow.com/questions/29898999/…也许这会对你有所帮助。
-
如果你真的应该解释惰性部分,我认为这里的第一个评估步骤不是很诚实......
-
@Carsten 确实,这些行完全是错误的。