让我们从中间开始,看看结果。
(x y, x (x z))
因为x
被应用于事物(y
、z
和x z
),所以我们知道它具有(a -> ?)
问号表示未知类型的类型。现在, 的结果x
被传递给x
in 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])