Haskell - 找出类型签名

时间:2014-03-02 19:31:28

标签: haskell functional-programming evaluate type-signature

我是Haskell和功能编程的新手,我无法弄清楚为什么类型签名

  

t2 =(\ x y z a - >((x.y)z,(y.x)z))

看起来像这样:

  

t2 ::(a - > a) - > (a - > a) - > a - > b - > (A,A)

你能告诉我它是如何运作的吗?

问候

2 个答案:

答案 0 :(得分:7)

(.)是组合函数,其类型为

(.) :: (b -> c) -> (a -> b) -> (a -> c)

所以,我们知道因为你正在撰写xy,所以它们必须是函数并且具有这样的类型:

x :: a -> b
y :: a' -> b'

请注意,组合两个函数时,右侧函数的输出类型必须与左侧函数的输入类型相匹配。因此,当您执行x . y时,我们可以推断出b'a属于同一类型。同样,我们可以推断a'b属于同一类型。这给了我们以下内容:

(y . x) :: a -> a
(x . y) :: b -> b

然而,您继续将这两项功能应用于z,这意味着ab必须是同一类型,即{{1}的类型},所以我们可以进一步推断

z

最后,变量(y . x) :: a -> a (x . y) :: a -> a z :: a 只是一个虚拟变量,实际上并没有在函数的定义中使用,所以它得到一个不同的类型变量。

答案 1 :(得分:2)

从lambda我们可以看到t2需要4个参数xyza。然后它返回一个元组。 . in用于组合。因此,我们可以看到xy都是函数,而不仅仅是值。然后我们看到我们同时拥有x . yy . x这意味着x的返回类型必须是y的参数类型,反之亦然。因此,我们知道xy必须具有相同的类型,因此a -> a是两者的类型。因此,x . y :: a -> ay . x :: a -> a因此我们知道z必须具有a类型。最后a,变量从不使用,因此它可以是任何类型,因为我们无法从中找到更多。