让我们从中间开始,结果。
(x y, x (x z))
因为x
被应用到的东西(y
,z
和x z
),我们知道它具有类型(a -> ?)
其中问号代表未知类型。现在,x
结果被传递给x
在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
的定义中的变量。第一个参数是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])
令人惊叹的答案,谢谢你一步步走过我。 –