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