我正在做评估 let 表达式的练习题,但我不明白这个表达式的输出。
下面是表达式:
let a = 2
b = 1:[i * 2 | i <- b]
f a = 1:[i * a | i <- (f a)]
in take (a+2) (f (head (tail b) ))
输出应该是[1,2,4,8]。有人可以逐步解释为什么这是输出
最佳答案
以下是分步说明:
let a = 2
b = 1:[i * 2 | i <- b]
f a = 1:[i * a | i <- (f a)]
in take (a+2) (f (head (tail b) ))
其中有两个不同的变量,称为 a
,其中一个隐藏另一个,因此首先让我们重命名其中一个,以避免意外混淆它们:
let outer_a = 2
b = 1:[i * 2 | i <- b]
f a = 1:[i * a | i <- (f a)]
in take (outer_a+2) (f (head (tail b) ))
现在我们可以替换 outer_a
并计算 +
:
let b = 1:[i * 2 | i <- b]
f a = 1:[i * a | i <- (f a)]
in take 4 (f (head (tail b) ))
根据map
重写列表推导式:
let b = 1:map (* 2) b
f a = 1:map (* a) (f a)
in take 4 (f (head (tail b) ))
使用迭代
而不是显式递归:
let b = iterate (* 2) 1
f a = iterate (* a) 1
in take 4 (f (head (tail b) ))
评估b
的前两个步骤:
let b = 1:2:iterate (* 2) 4
f a = iterate (* a) 1
in take 4 (f (head (tail b) ))
替换为b
:
let f a = iterate (* a) 1
in take 4 (f (head (tail (1:2:iterate (* 2) 4)) ))
评估tail
:
let f a = iterate (* a) 1
in take 4 (f (head (2:iterate (* 2) 4) ))
评估head
:
let f a = iterate (* a) 1
in take 4 (f 2)
替换为f a
:
take 4 (iterate (* 2) 1)
评估迭代
几次:
take 4 (1:2:4:8:iterate (* 2) 16)
评估采取
:
[1,2,4,8]
我们就完成了。
关于Haskell Let 表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715331/