理解(.)的类型签名

use*_*014 4 haskell functional-programming

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

(.) :: (b -> c) -> (a -> b) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)

和相关的定义

(f . g) x = f (g x)
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*zer 12

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

f . g === (.) f g
Run Code Online (Sandbox Code Playgroud)

现在,更容易看到currying

((.) f) g === f . g
Run Code Online (Sandbox Code Playgroud)

最后,请注意此类型签名相当于

(b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)

既然->是正确的联想.