通过替换统一具有不同arity的涂抹器
Unification of applicators with different arity through substitution
我可以统一以下术语:
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。我如何到达那里?
because foo
expects a ternary function but bar
has only two arguments
嗯,永远记住 Haskell 根本没有二元或三元函数——它只有一元函数。三元函数实际上是一元函数,结果是一元函数,结果是函数
在这种情况下,bar'
必须通过让 b'
成为函数类型来“伪造”一个额外的参数。这是bar的特殊版本:
-- b' ~ (d -> e)
bar :: (a' -> d -> e) -> a' -> d -> e
瞧,bar
有三个参数。
现在应该清楚如何将它与 foo
的参数统一起来了。
我可以统一以下术语:
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。我如何到达那里?
because
foo
expects a ternary function butbar
has only two arguments
嗯,永远记住 Haskell 根本没有二元或三元函数——它只有一元函数。三元函数实际上是一元函数,结果是一元函数,结果是函数
在这种情况下,bar'
必须通过让 b'
成为函数类型来“伪造”一个额外的参数。这是bar的特殊版本:
-- b' ~ (d -> e)
bar :: (a' -> d -> e) -> a' -> d -> e
瞧,bar
有三个参数。
现在应该清楚如何将它与 foo
的参数统一起来了。