为什么类型 f (f b c) (f (f a b) (f a c)) 不匹配 (.)?

Why doesn't the type f (f b c) (f (f a b) (f a c)) match (.)?

我刚刚制定了 (.) 的类型,据我所知,这是概括的,但是,在将其输入 Hoogle 后,我没有收到任何结果。

我早有预料

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

匹配

thistype ~ f (f b c) (f (f a b) (f a c))

技术上的答案是 Hoogle 将搜索拆分为参数和 return 外部 (->) 部分的类型,然后在组合结果之前单独搜索每个部分。外层 (->) 处理得非常特殊,特别是它很乐意重新排序参数。

Hoogle 以这种方式工作的更根本原因是它是一个搜索引擎,而不是一个统一引擎。如果您正在搜索上述内容,然后返回 (.),是否已经回答了您的问题?我的猜测可能不是。我最喜欢的例子是搜索 "a -> [(a,b)] -> b" 应该 return lookup,即使它不统一。