我正在为Haskell做练习问题,问题之一是
test3 x y = x (x y)
我必须找到其类型。
解决方案是
test3 :: (a -> a) -> a -> a
我不明白为什么解决方案中的变量都是a,而不是将x和y称为两个不同的变量,例如a和b。有人可以解释一下,还可以找到如何找到此问题的类型。
答案 0 :(得分:19)
实际上,这是一个非常有趣的练习。它不需要任何特定于Haskell的知识-它实际上只是基本逻辑。
test3 x y = x (x y)
要注意的第一件事是test3
接受2个参数(x
和y
)并产生某种结果。因此类型必须为形式
a -> b -> c
并且仅需弄清楚a
,b
和c
是什么,或者至少它们之间存在什么关系。
因此,让我们更详细地检查结果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 -> d
。 d -> c
等于b -> d
的唯一方法是,如果d -> c
,b
和c
都是同一类型。 (因为函数的类型取决于它们的输入类型和结果类型。)因此,d
的整体类型必须为
test3
您已被告知的确切含义是-将(b -> b) -> b -> b
重命名为a
。 (正如我所说,这些名称是任意的,因此不相关。)