的论点和自由点在Haskell号[复制](Number of arguments and point

2019-07-30 10:07发布

这个问题已经在这里有一个答案:

  • 用不同数量的参数方程定义的函数 3个回答

随着多模式匹配,的参数不同的数字是不可能的,即使有免费的点!

foo True b = b + 2
foo _ = id

例如不工作。 但

foo True = (+2)
foo _ = id

确实。 有时候,我们只能在功能的一部分使用免费的点,所以...

为什么? 是不是太硬GHC? :'(

Answer 1:

为什么? 是不是太硬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



Answer 2:

每个函数方程必须具有相同数量的参数。 这就是为什么你的第一个例子失败。

要修复它,用

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

是错误的,因为分支机构有不同的类型。

当然,这是挥手,实际的事情发生在幕后比较复杂



文章来源: Number of arguments and point-free in Haskell [duplicate]