我只是使用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 回答
你几乎得到它,它需要
b -> c
并返回一个函数(a -> b) -> (a -> c)
,当给定(a -> b)
返回一个函数a -> c
. 知道在Haskell中,您可以将运算符包装在parens中并使用它前缀,这也可能会有所帮助现在,更容易看到currying
最后,请注意此类型签名相当于
由于
->
是正确的关联 .您可以使用以下几个参数读取函数签名:
所以,
(f .) :: (a -> b) -> (a -> c)
接下来是一样的:
函数
(.)
将2个函数(a -> b)
作为参数并返回其组成