[英]Inferring type of composed function Haskell
我无法推断此函数的类型:
(foldr (.))
我知道以下类型:
(.) :: (b -> c) -> (a -> b) -> a -> c
foldr :: (a -> b -> b) -> b -> [a] -> b
但是现在我不知道该怎么办。是否有一种方法能够始终以系统的方式推断类型? 它如何适用于这种情况?
我通常按照以下步骤操作:
写下他们的类型:
(.) :: (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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.