-- 0,执行这个函数,看看结果,也就是让玩具动起来 Prelude> zero f a -- 返回空字符串,也就是加字符a这个动作没有被执行 "" -- 通过0加一定义1 Prelude> one = addOne zero -- 通过1加一定义2 Prelude> two = addOne one -- 通过1 + 2定义3 Prelude> three = add one two -- 查看3的结果 Prelude> three f a -- 字符a被加到字符串头上3次 "aaa"
虽然我们之前假设系统中没有数字类型,但为了方便我们的验证,用其做一下检查是没问题的
我们可以说动作是——给一个系统数字加一,动作的初始参数是0
运行
1 2 3 4 5 6 7
let f = (+1) let a = 0
one = addOne zero two = addOne one three = add one two three f a
得到
1 2 3 4 5 6 7 8
Prelude> let f = (+1) Prelude> let a = 0 Prelude> Prelude> one = addOne zero Prelude> two = addOne one Prelude> three = add one two Prelude> three f a 3
也就是foldr的第一个参数,类型为(a -> b -> b),在实际执行过程中,a类型是列表内容的类型,第二个参数b类型,第一次是初始值,也就是id,实际类型是一个函数,同时,结果仍然是b,是一个函数,作为下一次计算(a -> b -> b)的第二参数
由于foldr的最终返回结果是一个函数,所以可以应用一个参数,这个参数在foldr step id xs z这里,也就是z,或者说可以把foldr step id xs z看作是(foldr step id xs) z,foldr全部折叠完,其最后结果是一个函数,然后用z作为函数的参数对这个最终函数进行调用