Haskell中的参数数量和无点数

L01*_*man 15 haskell arguments currying pointfree

使用多个模式匹配,即使没有点,也不可能有不同数量的参数!

foo True b = b + 2
foo _ = id
Run Code Online (Sandbox Code Playgroud)

不起作用的例子.但

foo True = (+2)
foo _ = id
Run Code Online (Sandbox Code Playgroud)

确实.有时我们只能在函数的一个部分使用无点,所以......

为什么?GHC太难了吗?:'(

Dan*_*ton 20

为什么?GHC太难了吗?

.GHC并不是太难.实际上,这是Haskell报告的错误.

请参阅:Haskell Report 2010>声明和绑定>函数绑定

函数绑定将变量绑定到函数值.变量x的函数绑定的一般形式是:

x p1 1 ... p1 k match1
...
x pn 1 ... pn k matchn

[...等等...]

翻译:函数的一般绑定形式在语义上等价于等式(即简单模式绑定):

x =\x 1 ... x k - > case(x 1,...,x k)of

(p11,...,p1k)match1
...
(pn1,...,pnk)matchn
其中x i是新标识符.

(强调我的)

Mihai建议,虽然函数定义在语义上等同于lambda和case表达式,但它们不一定按照这种方式编译.

问题是,Haskell报告定义了函数声明,使得它们必须在等式的左侧具有相同数量的输入.通过在k第1和第n个函数声明行中保持相同的事实(以及暗示中间的所有行)清楚地表明了这一点.就是限制的原因; 它与GHC的实施细节无关.

TL;博士

不允许它的选择只是风格问题. - 奥古斯丁