即使使用点除法,多个模式匹配也不可能具有不同数量的参数!
foo True b = b + 2
foo _ = id
举例来说,它不能正常工作。但是
foo True = (+2)
foo _ = id
有时我们只能在函数的某一部分中使用无点风格(point-free),为什么呢?这是 GHC 处理不了吗? :'(
为什么? GHC 处理不了吗?
不是的。这对于 GHC 来说一点也不难。实际上,这是 Haskell 报告的问题。
参见:Haskell Report 2010 > 声明和绑定 > 函数绑定
一个函数绑定将变量绑定到一个函数值。变量x的函数绑定的一般形式为:foo True b = b + 2
foo _ x = id x
正如您所看到的,这两个方程具有相同数量的参数。
涉及模式匹配的多个方程被翻译为case表达式。在您的情况下,foo
的翻译大致如下:
foo a b = case a of
True -> b + 2
_ -> id x
所有的case
分支必须具有相同的类型,因此您的第一个示例应该被翻译为:
foo a b = case a of
True -> b + 2
_ -> id
这是错误的,因为分支具有不同的类型。
当然,这只是简单地说明问题,背后实际发生的事情更加复杂。
foo
会完成相同的操作。 - L01mancase
表达式。 - Mihai Maruseac
id
翻译为(\x -> id x)
对编译器来说应该很容易。 - L01manunpl
函数,它可以做到这一点。 - L01man