Pascal三角形的评价是多少?

Ram*_*eka 17 haskell lazy-evaluation

如果我将此常量pascal定义为

pascal :: [[Int]]
pascal = iterate newrow [1]
  where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0])
Run Code Online (Sandbox Code Playgroud)

pascal !! 50 !! 50在GHCI中评估,这个三角形的大部分是什么?这种懒惰是否意味着只计算必要的值(加上一堆thunk)?

kos*_*kus 25

是的,仅评估计算相关元素所需的元素.

GHCI提供:sprint:print调试命令,可以给你什么价值的部分已经被评估的一些信息.

在这个例子中:

GHCi> :sprint pascal
pascal = _
Run Code Online (Sandbox Code Playgroud)

(那是因为此时没有评估任何内容,并且thunk显示为_.)

GHCi> pascal !! 5 !! 5
1
Run Code Online (Sandbox Code Playgroud)

(我没有使用,50因为这个例子会变得太长.)

GHCi> :sprint pascal
pascal = [1] : [_,1] : [_,_,1] : [_,_,_,1] : [_,_,_,_,1] :
         (_ : _ : _ : _ : _ : 1 : _) : _
Run Code Online (Sandbox Code Playgroud)

现在您可以清楚地了解已查看的部件.

让我们再试一次:

GHCi> pascal !! 5 !! 4
5
GHCi> :sprint pascal
pascal = [1] : [1,1] : [_,2,1] : [_,_,3,1] : [_,_,_,4,1] :
         (_ : _ : _ : _ : 5 : 1 : _) : _
Run Code Online (Sandbox Code Playgroud)

还有一个:

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 : _) : _
Run Code Online (Sandbox Code Playgroud)