我能够统一以下术语:
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
的参数统一起来了。