我正在使用Richard Bird的书学习Haskell和函数式编程,并且遇到了(。)函数的类型签名。即
(.) :: (b -> c) -> (a -> b) -> (a -> c)
以及相关的定义
(f . g) x = f (g x)
我理解操作员在做什么但是对于如何读取类型签名感到有点困惑。是说(。)将第一个参数作为类型(b - > c)的函数,然后返回类型(a - > b)的函数,最后返回类型的函数(a - > C)?这是读取类型签名的正确方法吗?
此外,这可能是一个currying的例子,其中(。)是一个带有两个参数的curry函数?或者这不是考虑currying的正确方法吗?
答案 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)
作为参数并返回其组合