推断组合函数Haskell的类型

时间:2014-05-04 18:25:16

标签: function haskell types composition

我无法推断出此功能的类型:

(foldr (.))

我知道的类型:

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

foldr :: (a -> b -> b) -> b -> [a] -> b

但现在我不知道该怎么做..有没有一种方法可以始终能够系统地推断出类型?它将如何适用于这种情况?

1 个答案:

答案 0 :(得分:4)

我通常按照以下步骤操作:

写下他们的类型:

(.) :: (b -> c) -> (a -> b) -> a -> c
foldr :: (a -> b -> b) -> b -> [a] -> b

使所有类型变量名称不同:

(.) :: (b -> c) -> (a -> b) -> a -> c
foldr :: (x -> y -> y) -> y -> [x] -> y

现在,由于您将(.)应用于foldr的第一个参数,因此可以推断出类型之间的以下关系:

foldr :: (   x ->       y ->         y  ) -> y -> [x] -> y
(.) ::   (b -> c) -> (a -> b) -> (a -> c)

从上面你可以推断出以下关系:

x ~ (b -> c)
y ~ (a -> b)
y ~ (a -> c)

从上面的y,您可以推断bc应该相同。

foldr (.)的类型应为:

foldr (.) :: y -> [x] -> y

现在用新的派生代替yx,您将获得所需的类型:

foldr (.) :: (a -> b) -> [b -> b] -> a -> b