繁体   English   中英

推断组合函数Haskell的类型

[英]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 ,您可以推断bc应该相同。

文件foldr (.)的类型应为:

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

现在将yx替换为新的派生值,您将获得所需的类型:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM