我正在为 Haskell 做练习题,其中一个问题是
test3 x y = x (x y)
我必须找到它的类型。
解决办法是
test3 :: (a -> a) -> a -> a
我不明白为什么解决方案中的变量都是 a,而不是将 x 和 y 视为两个不同的变量,如 a 和 b。有人可以解释一下并说明如何找到这个问题的类型吗?
实际上,这是一个非常有趣的练习。它不需要任何特定于 Haskell 的知识 - 它实际上只是基本逻辑。
test3 x y = x (x y)
首先要注意的是test3
需要 2 个参数(x
and y
)并产生某种结果。所以类型必须是以下形式
a -> b -> c
只需要弄清楚什么a
, b
and c
是,或者至少它们之间存在什么关系。
让我们检查一下结果x (x y)
更详细地说。它告诉我们x
是一个函数,可以采用y
作为一个论点。我们说过y
有类型b
(这是一个完全任意的名称,但我们现在就坚持使用它) - 所以x
必须是一个函数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
is if b
, c
and d
都是同一类型。 (因为函数的类型是由它们的输入类型和结果类型决定的。)所以整体类型test3
必须采用以下形式
(b -> b) -> b -> b
这正是您所被告知的 - 直到重命名a
to b
。 (正如我所说,这些名称无论如何都是任意的 - 所以它不相关。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)