【发布时间】:2014-04-11 11:11:54
【问题描述】:
我有这个功能
doubleMe :: Num a => [a] -> [a]
doubleMe [] = []
doubleMe (x:xs) = (2*x):(doubleMe xs)
考虑一下:
doubleMe(doubleMe([1,2,3]))
第一步显然是
doubleMe(doubleMe([1,2,3])) = doubleMe(2:doubleMe[2,3])
因为没有其他可能。
这是我想知道的下一步。为什么是
doubleMe(2:doubleMe[2,3]) = 4:(doubleMe(doubleMe([2,3])))
而不是
doubleMe(2:doubleMe[2,3]) = doubleMe(2:4:doubleMe([3]))
?
到目前为止,我能想出的唯一答案是
因为它有意义。否则 Haskell 不会在列表上懒惰地行动。
但这不是答案,而是逃避。真正的答案是什么?
【问题讨论】:
-
其实第一步是
doubleMe(doubleMe([1,2,3])) -> doubleMe((2*1) : doubleMe [2,3])。(2*1)在出现之前不会被强迫(如果有的话!)。
标签: haskell