通过替换实现不同粒径施胶剂的统一



我能够统一以下术语:

foo :: (a -> b -> c) -> a -> b -> c
bar :: (a' -> b') -> a' -> b'
foo bar
a ~ (a' -> b')
b ~ a'
c ~ b'
(a' -> b') -> a' -> b'

但是我坚持应用以下统一的正确规则,因为foo期望一个三元函数,但bar只有两个参数:

foo :: (a -> b -> c -> d) -> a -> b -> c -> d
bar :: (a' -> b') -> a' -> b'
foo bar
-- ...?
(a' -> c -> d) -> a' -> c -> d

推断的类型来自GHCI。我怎么去那儿?

因为foo期望三元函数而bar只有两个参数

请记住,Haskell并没有真正的二元或三元函数——它只有一元函数。三元函数实际上是一元函数,其结果是一元函数,其结果是函数。

在这种情况下,bar'必须通过让b'为函数类型来"伪造"一个额外的参数。这是bar的特殊版本:

-- b' ~ (d -> e)
bar :: (a' -> d -> e) -> a' -> d -> e

bar

有三个参数。现在应该很清楚如何将其与foo的参数统一起来了。

最新更新