我是Haskell和功能编程的新手,我无法弄清楚为什么类型签名
t2 =(\ x y z a - >((x.y)z,(y.x)z))
看起来像这样:
t2 ::(a - > a) - > (a - > a) - > a - > b - > (A,A)
你能告诉我它是如何运作的吗?
问候
答案 0 :(得分:7)
(.)
是组合函数,其类型为
(.) :: (b -> c) -> (a -> b) -> (a -> c)
所以,我们知道因为你正在撰写x
和y
,所以它们必须是函数并且具有这样的类型:
x :: a -> b
y :: a' -> b'
请注意,组合两个函数时,右侧函数的输出类型必须与左侧函数的输入类型相匹配。因此,当您执行x . y
时,我们可以推断出b'
和a
属于同一类型。同样,我们可以推断a'
和b
属于同一类型。这给了我们以下内容:
(y . x) :: a -> a
(x . y) :: b -> b
然而,您继续将这两项功能应用于z
,这意味着a
和b
必须是同一类型,即{{1}的类型},所以我们可以进一步推断
z
最后,变量(y . x) :: a -> a
(x . y) :: a -> a
z :: a
只是一个虚拟变量,实际上并没有在函数的定义中使用,所以它得到一个不同的类型变量。
答案 1 :(得分:2)
从lambda我们可以看到t2
需要4个参数x
,y
,z
和a
。然后它返回一个元组。 .
in用于组合。因此,我们可以看到x
和y
都是函数,而不仅仅是值。然后我们看到我们同时拥有x . y
和y . x
这意味着x
的返回类型必须是y
的参数类型,反之亦然。因此,我们知道x
和y
必须具有相同的类型,因此a -> a
是两者的类型。因此,x . y :: a -> a
和y . x :: a -> a
因此我们知道z
必须具有a
类型。最后a
,变量从不使用,因此它可以是任何类型,因为我们无法从中找到更多。