1

我能够统一以下术语:

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。我如何到达那里?

4

1 回答 1

1

因为foo需要一个三元函数但bar只有两个参数

好吧,永远记住,Haskell 根本没有二元或三元函数——它只有一元函数。三元函数实际上是一个一元函数,其结果是一个一元函数,其结果是一个函数。

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

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

瞧,bar有三个论点。

现在应该清楚如何将其与 的论点统一起来foo

于 2021-02-05T21:42:56.913 回答