【问题标题】:Haskell - find out type SignatureHaskell - 找出类型签名
【发布时间】:2014-03-02 19:31:28
【问题描述】:

我是 Haskell 和函数式编程的新手,我无法弄清楚为什么要使用的类型签名

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

看起来像这样:

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

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

问候

【问题讨论】:

  • 这确实应该是许多关于语法和类型推断的每个部分的单独问题,您会感到困惑。 Lambda 表示法 (\a -> b) 与函数应用 (f x) 和函数组合 (x . y,这实际上只是一种函数应用) 以及读取 eta-reduced 的函数 (plus = (+) vs @ 987654325@).

标签: haskell functional-programming evaluate type-signature


【解决方案1】:

(.)是合成函数,它的类型是

(.) :: (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必须是同一类型,即z的类型,所以我们可以进一步推断

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

最后,变量a 只是一个虚拟变量,并没有在函数定义中实际使用,因此它得到了一个不同类型的变量。

【讨论】:

    【解决方案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,该变量从未使用过,因此它可以是任何类型,因为我们无法从中找到更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多