这个问题已经在这里有一个答案:
- 用不同数量的参数方程定义的函数 3个回答
随着多模式匹配,的参数不同的数字是不可能的,即使有免费的点!
foo True b = b + 2
foo _ = id
例如不工作。 但
foo True = (+2)
foo _ = id
确实。 有时候,我们只能在功能的一部分使用免费的点,所以...
为什么? 是不是太硬GHC? :'(
这个问题已经在这里有一个答案:
随着多模式匹配,的参数不同的数字是不可能的,即使有免费的点!
foo True b = b + 2
foo _ = id
例如不工作。 但
foo True = (+2)
foo _ = id
确实。 有时候,我们只能在功能的一部分使用免费的点,所以...
为什么? 是不是太硬GHC? :'(
为什么? 是不是太硬GHC?
没有 。 这是不是在所有太难GHC。 其实,这是哈斯克尔报告的故障。
见: 2010 Haskell的报告>的声明和绑定>功能绑定
的函数的结合结合到函数值的变量。 的函数的一般形式为变量x绑定是:
X P1 1 ... P1ķMATCH1
...
X PN 1 ... PNķmatchn[...等等等等...]
翻译:对函数的一般形式结合在语义上等同于方程(即简单的模式结合):
X = \ X 1 ... X 的k - >情况下,(X 1,...,X k)的
(P11,...,P1K)MATCH1
...
(PN1,...,PNK)matchn
其中x i为新的标识符。
(重点煤矿)
虽然函数定义在语义上等同于一个lambda&情况下表达,它们不一定编译的方式,因为米哈伊建议。
问题是,Haskell的报告定义函数的声明,使得它们必须具有对等式的左边相同数量的输入。 这是由以下事实清楚地表明k
保留在第一和第n函数声明线两者是相同的(并且暗示,所有在之间的线)。 这是限制的原因; 它无关GHC的实现细节 。
TL;博士
选择不要让这只是一个风格问题。 - augustss
每个函数方程必须具有相同数量的参数。 这就是为什么你的第一个例子失败。
要修复它,用
foo True b = b + 2
foo _ x = id x
正如你看到的,两个方程具有相同数量的参数。
涉及图案匹配多个方程被翻译成的情况下的表达式。 在你的情况foo
被大致为翻译
foo a b = case a of
True -> b + 2
_ -> id x
所述的两个(所有)分支case
必须具有相同的类型,这将被翻译成这样你第一示例
foo a b = case a of
True -> b + 2
_ -> id
是错误的,因为分支机构有不同的类型。
当然,这是挥手,实际的事情发生在幕后比较复杂