让我们从中间开始,看看结果。
(x y, x (x z))
因为x被应用于事物(y、z和x z),所以我们知道它具有(a -> ?)问号表示未知类型的类型。现在, 的结果x被传递给xin x (x z),所以它的输入类型必须是它的输出类型:
x :: a -> a
现在,x应用于y和z,所以它们都必须是 类型a。x y并且x (x z)也是类型a(因为那是x的返回类型),所以t2返回类型的东西(a, a)。
x把它和它的参数的类型( , y, 和)放在一起z,我们得到它有类型
(a -> a) -- x's type
-> a -- y's type
-> a -- z's type
-> (a, a) -- the result type
t2对于你的第二个问题,让我们先看看在's 的定义中哪些东西与哪些变量绑定。第一个参数是 x,所以在这种情况下
x = (take 3 . reverse)
下一个参数是 y,所以
y = mnr
同样对于 z,
z = mnr
结果将是(x y, x (x z)),所以让我们评估一下
(x y, x (x z))
= ((take 3 . reverse) mnr, (take 3 . reverse) ((take 3 . reverse) mnr))
= (take 3 (reverse mnr), take 3 (reverse (take 3 (reverse mnr))))
对于 的这种特殊情况mnr = [0,1,2,3,4,5,6],我们得到
= (take 3 (reverse [0,1,2,3,4,5,6]), take 3 (reverse (take 3 (reverse [0,1,2,3,4,5,6]))))
= (take 3 [6,5,4,3,2,1,0], take 3 (reverse (take 3 [6,5,4,3,2,1,0])))
= ([6,5,4], take 3 (reverse [6,5,4]))
= ([6,5,4], take 3 [4,5,6])
= ([6,5,4], [4,5,6])