Haskell 帕斯卡';这是什么三角形?

Haskell 帕斯卡';这是什么三角形?,haskell,lazy-evaluation,Haskell,Lazy Evaluation,如果我把这个常数pascal定义为 pascal :: [[Int]] pascal = iterate newrow [1] where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0]) pascal::[[Int]] pascal=迭代新行[1] 其中newrow=(带(+)尾的zipWith)。([0]++) . (++[0]) 我计算pascal!!50 !! 50在GHCI中,这计算了多少三角形?懒惰是否意味着只

如果我把这个常数
pascal
定义为

pascal :: [[Int]]
pascal = iterate newrow [1]
  where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0])
pascal::[[Int]]
pascal=迭代新行[1]
其中newrow=(带(+)尾的zipWith)。([0]++) . (++[0])

我计算
pascal!!50 !! 50
在GHCI中,这计算了多少三角形?懒惰是否意味着只计算必要的值(加上一堆thunk?

是的,只计算所讨论的元素所需的元素

GHCi提供了
:sprint
:print
调试命令,可以为您提供有关已评估值的哪些部分的一些信息

关于这个例子:

GHCi> :sprint pascal
pascal = _
(这是因为此时未计算任何值,thunk显示为

(我没有使用
50
,因为这样这个例子就太长了。)

现在,你已经非常清楚地了解到哪些部分已经被研究过了

让我们再试一次:

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 : _) : _

是-这将创建到
为止的所有thunk!!50 !! 50
并计算计算此条目所需的值。在GHCi中,在计算特定位置后,尝试
:sprint pascal
,如
pascal!!50 !! 50
,您可以看到哪些已评估,哪些未评估。@kosmikus+1-您应该回答这个问题!-如果你把输出(或屏幕截图)包括进来,它会给人留下更深刻的印象——我正在考虑把它打印出来并挂在我的黑板上(“嘿,这是什么?”-“…哦”):DNice<代码>newrow=zipWith(+)。(0:)(++[0])。
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 : _) : _