理解(。)的类型签名

时间:2013-12-25 22:00:23

标签: haskell functional-programming

我正在使用Richard Bird的书学习Haskell和函数式编程,并且遇到了(。)函数的类型签名。即

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

以及相关的定义

(f . g) x = f (g x)

我理解操作员在做什么但是对于如何读取类型签名感到有点困惑。是说(。)将第一个参数作为类型(b - > c)的函数,然后返回类型(a - > b)的函数,最后返回类型的函数(a - > C)?这是读取类型签名的正确方法吗?

此外,这可能是一个currying的例子,其中(。)是一个带有两个参数的curry函数?或者这不是考虑currying的正确方法吗?

2 个答案:

答案 0 :(得分:12)

你几乎得到它,需要b -> c并返回一个函数(a -> b) -> (a -> c),当给定(a -> b)时会返回一个函数a -> c。了解在Haskell中,您可以将运算符包装在parens中并使用它前缀,这也可能会有所帮助

f . g === (.) f g

现在更容易看到讨好的

((.) f) g === f . g

最后,请注意此类型签名等同于

(b -> c) -> (a -> b) -> a -> c

由于->是正确关联的。

答案 1 :(得分:4)

您可以使用以下几个参数读取函数签名:

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

所以,(f .) :: (a -> b) -> (a -> c)

接下来是相同的:

foo :: a -> b -> c -> d -> e

foo :: a ->(b ->(c ->(d -> e)))

函数(.)将2个函数(a -> b)作为参数并返回其组合