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;博士
不允许它的选择只是风格问题. - 奥古斯丁