Haskell中的函数类型推断

时间:2019-03-24 21:38:24

标签: haskell

我正在为Haskell做练习问题,问题之一是

test3 x y = x (x y)

我必须找到其类型。

解决方案是

test3 :: (a -> a) -> a -> a

我不明白为什么解决方案中的变量都是a,而不是将x和y称为两个不同的变量,例如a和b。有人可以解释一下,还可以找到如何找到此问题的类型。

1 个答案:

答案 0 :(得分:19)

实际上,这是一个非常有趣的练习。它不需要任何特定于Haskell的知识-它实际上只是基本逻辑。

test3 x y = x (x y)

要注意的第一件事是test3接受2个参数(xy)并产生某种结果。因此类型必须为形式

a -> b -> c

并且仅需弄清楚abc是什么,或者至少它们之间存在什么关系。

因此,让我们更详细地检查结果x (x y)。它告诉我们x是一个可以将y作为参数的函数。我们已经说过y的类型为b(这是一个完全任意的名称,但是现在让我们继续使用它)-因此x必须是一个使用{{1}并产生某种类型的结果。现在将其称为b类型。因此我们知道d的类型为

test3

最后,再次从表达式(b -> d) -> b -> c 中,我们看到x (x y)必须采用x-我们已将其分配为类型x y-并返回结果。这个结果就是d的整体结果,我们选择了其类型为test3。因此,在上面的c中(我们已经为其分配了类型x)必须具有类型b -> dd -> c等于b -> d的唯一方法是,如果d -> cbc都是同一类型。 (因为函数的类型取决于它们的输入类型和结果类型。)因此,d的整体类型必须为

test3

您已被告知的确切含义是-将(b -> b) -> b -> b 重命名为a。 (正如我所说,这些名称是任意的,因此不相关。)