我无法推断出此功能的类型:
(foldr (.))
我知道的类型:
(.) :: (b -> c) -> (a -> b) -> a -> c
foldr :: (a -> b -> b) -> b -> [a] -> b
但现在我不知道该怎么做..有没有一种方法可以始终能够系统地推断出类型?它将如何适用于这种情况?
答案 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
,您可以推断b
和c
应该相同。
foldr (.)
的类型应为:
foldr (.) :: y -> [x] -> y
现在用新的派生代替y
和x
,您将获得所需的类型:
foldr (.) :: (a -> b) -> [b -> b] -> a -> b