阅读Haskell类型

时间:2019-01-16 14:49:56

标签: haskell

让我说:

t = \x y  -> x.y 

其类型为:

*Main> :t t
t :: (b -> c) -> (a -> b) -> a -> c

如果我正确理解,x.y可以写为x(y),这意味着我们首先求解y的{​​{1}},然后求解(b -> c)的x (b -> a)只是函数中的参数;我们给a -> c(x)和a(y)。 这正确吗?如果不正确,我该怎么读? c是什么意思,(b -> c) -> (a-> b)是哪个x

我该如何阅读:

y

这里t1 = \x y z -> x.y.z *Main> :t t1 t1 :: (b1 -> c) -> (b2 -> b1) -> (a -> b2) -> a -> c 是什么b1,这是如何工作的?当我有3个参数作为输入时,为什么在-> c处?请帮助我理解这一点

1 个答案:

答案 0 :(得分:3)

写函数类型(b -> c) -> (a -> b) -> a -> c的更好方法是(b -> c) -> (a -> b) -> (a -> c),其中(a -> c)周围有明确的括号。此重写试图使该函数清楚不带三个参数并返回类型为c的东西。它带有两个参数,并返回类型为(a -> c)的函数。这是currying的概念,它是Haskell编程 1 不可或缺的部分。

在您的第一个示例中,(b -> c)x,而(a -> b)y。返回类型(a -> c)是通过组合参数函数获得的新函数。

您的第二个示例可以用相同的方式解释。 (b1 -> c)对应于x(b2 -> b1)对应于y,而(a -> b2)对应于z。返回类型是通过首先组合zy以获得类型(a -> b1)的函数,然后将此函数与a组合以获得类型{{1}的函数而获得的}。该函数最终返回什么。


1:实际上,最正确的说法是该函数接受类型为(a -> c)的一个参数并返回类型为(b -> c)的函数,但这并不是特别重要。