这是一个假装的整数类型:
data Int2 = ... -- 2 bit signed integers [-2, -1, 0, 1]
deriving (Num, Ord, Eq, ...)
假设您的函数是在Int2 值上定义的:
f :: Int2 -> [Int2] -> [Int2]
f n (xs) = if n < 0 then f (n-1) (n:xs) else xs
这使得计算f n xs 的一个评估步骤变得相当容易:
f 1 xs = xs
f 0 xs = xs
f (-1) xs = f (-2) (-1 : xs)
f (-2) xs = f 1 (-2 : xs) -- because finite signed arithmetic wraps around
从那里我们可以计算出f n [] 的全部价值:
f 1 [] = []
f 0 [] = []
f (-1) [] = f (-2) [-1] = f 1 [-2, -1] = [-2, -1]
f (-2) [] = f 1 [-2] = [-2]
每个都计算了一个值,但请注意,在我们从 f (-1) [] 中得到一个列表之前,它需要 3 个评估步骤。
现在看看你能不能算出计算f (-1) [] 需要多少步,如果它是在4 位数字上定义的。 8位? 32位? 64位?如果它使用的是Integer,而 没有下限呢?
懒惰对你没有任何帮助,因为没有部分结果,只有递归调用。这就是两者的区别:
lazyReplicate 0 _ = []
lazyReplicate n x = x : lazyReplicate (n - 1) x
和
strictReplicate n x = helper [] n x where
helper xs 0 _ = xs
helper xs n x = helper (x : xs) n x