Haskell 跟踪可以给出';倒置';折叠式加工

Haskell 跟踪可以给出';倒置';折叠式加工,haskell,Haskell,当我编译“modified sum”(«_sum_folds.hs»)文件时: 。。。将其应用于“[1..5]”,我得到: *Main > _sum ([1..5]) * 1 - 0 * 2 - 1 * 3 - 3 * 4 - 6 * 5 - 10 * 15 * it :: Integer (订购“foldl”流程可以…) 如果我移除, 我得到: (我们只有) …:(x)内部元素的处理顺序似乎已颠倒(它是一个“foldl”) 什么意思?表达式foldl(+)0[1..3]创建以下表达式

当我编译“modified sum”(«_sum_folds.hs»)文件时:

。。。将其应用于“[1..5]”,我得到:

*Main > _sum ([1..5])

* 1 - 0
* 2 - 1
* 3 - 3
* 4 - 6
* 5 - 10
* 15
* it :: Integer
(订购“foldl”流程可以…)

如果我移除<++“-“++显示acc>, 我得到:

(我们只有

…:<1..5]>(x)内部元素的处理顺序似乎已颠倒(它是一个“foldl”)


什么意思?

表达式
foldl(+)0[1..3]
创建以下表达式树:

              +
             / \
            +   3
           / \
          +   2
         / \
        0   1
在您的情况下,
\u sum
\u sum2
都可以这样构建一个树:

              tr
             / \
            tr  3
           / \
          tr   2
         / \
        0   1
这里
tr
是褶皱中进行累积的功能 和追踪

_sum2 要访问的第一个操作是树顶部的
tr\u3
。 在
tr
功能中,3是
x
,uuuuu是
acc

\u sum2
中发生这种情况时,将打印3

然后计算
acc
,因此计算
tr\uuuuuu2
,结果显示2

然后计算
tr\uuuu1
,因此打印1

_总数 然而,在\u sum中,一个不同的事件过程展开了(没有双关语)

我们再次从树的顶部开始:
tr\u3

步骤1) 由于在
\u sum
中也打印出了
acc
,Haskell需要 评估它,即
tr\uuuuu2
。 完成此评估后,它将打印出
acc
,然后打印3

步骤2) 要计算
tr\uuuuu2
,因为您正在打印
acc
,Haskell需要计算它,即2-即
tr\uuuuuu1
左侧的树。 完成此评估后,它将打印出
acc
,然后打印2

步骤3) 要计算
tr\uuuuuu1
,由于您正在打印
acc
,Haskell需要计算1左侧的树,即0。 完成此评估后,它将打印出
acc
,然后打印1。 在本例中,0已被计算,因此它打印出0,然后打印出1

然后控制返回到步骤2,显示
acc
(1),然后显示2

然后控制返回到步骤1,并显示
acc
(3)和3。

中的图表可能会有所帮助。
              +
             / \
            +   3
           / \
          +   2
         / \
        0   1
              tr
             / \
            tr  3
           / \
          tr   2
         / \
        0   1