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)
既然->是正确的联想.