如果我将此常量pascal
定义为
pascal :: [[Int]]
pascal = iterate newrow [1]
where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0])
我评估了GHCI中的pascal !! 50 !! 50
,这个三角形的多少是如此?这种懒惰是否意味着只计算必要的值(加上一堆thunk)?
答案 0 :(得分:25)
是的,仅评估计算相关元素所需的元素。
GHCi提供:sprint
和:print
调试命令,可以为您提供有关已评估值的哪些部分的信息。
在这个例子中:
GHCi> :sprint pascal
pascal = _
(那是因为此时没有评估任何内容,并且thunk显示为_
。)
GHCi> pascal !! 5 !! 5
1
(我没有使用50
,因为这个例子会变得太长。)
GHCi> :sprint pascal
pascal = [1] : [_,1] : [_,_,1] : [_,_,_,1] : [_,_,_,_,1] :
(_ : _ : _ : _ : _ : 1 : _) : _
现在你已经非常清楚地了解了哪些部分。
让我们再试一次:
GHCi> pascal !! 5 !! 4
5
GHCi> :sprint pascal
pascal = [1] : [1,1] : [_,2,1] : [_,_,3,1] : [_,_,_,4,1] :
(_ : _ : _ : _ : 5 : 1 : _) : _
还有一个:
GHCi> pascal !! 10 !! 5
252
GHCi> :sprint pascal
pascal = [1] : [1,1] : [1,2,1] : [1,3,3,1] : [1,4,6,4,1] :
(1 : 5 : 10 : 10 : 5 : 1 : _) :
(_ : 6 : 15 : 20 : 15 : 6 : _) :
(_ : _ : 21 : 35 : 35 : 21 : _) :
(_ : _ : _ : 56 : 70 : 56 : _) :
(_ : _ : _ : _ : 126 : 126 : _) :
(_ : _ : _ : _ : _ : 252 : _) : _