Haskell 中函数的类型推断

2023-11-24

我正在为 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(使用前将#替换为@)

Haskell 中函数的类型推断 的相关文章

随机推荐