Haskell中的参数数和自由点数
使用多模式匹配,即使没有点,也不可能有不同数量的参数Haskell中的参数数和自由点数,haskell,arguments,currying,pointfree,Haskell,Arguments,Currying,Pointfree,使用多模式匹配,即使没有点,也不可能有不同数量的参数 foo True b = b + 2 foo _ = id 例如,它不起作用。但是 foo True = (+2) foo _ = id 是的。有时我们只能在函数的一部分使用无点,所以 为什么??这对GHC来说太难了吗?:'(每个函数方程必须具有相同数量的参数。这就是第一个示例失败的原因 要修复它,请使用 foo True b = b + 2 foo _ x = id x 如您所见,两个方程都有相同数量的参数 涉及模式匹配的多个方程被转
foo True b = b + 2
foo _ = id
例如,它不起作用。但是
foo True = (+2)
foo _ = id
是的。有时我们只能在函数的一部分使用无点,所以
为什么??这对GHC来说太难了吗?:'(每个函数方程必须具有相同数量的参数。这就是第一个示例失败的原因
要修复它,请使用
foo True b = b + 2
foo _ x = id x
如您所见,两个方程都有相同数量的参数
涉及模式匹配的多个方程被转换为case表达式。在您的例子中,foo
被大致转换为
foo a b = case a of
True -> b + 2
_ -> id x
案例的两个(所有)分支必须具有相同的类型,因此您可以将第一个示例翻译为
foo a b = case a of
True -> b + 2
_ -> id
是错误的,因为分支具有不同的类型
当然,这是挥手,幕后发生的实际情况更为复杂
为什么?这对GHC来说太难了吗
不。这对GHC来说一点也不难。实际上,这是哈斯克尔报告的错误
见:
函数绑定将变量绑定到函数值。变量x的函数绑定的一般形式为:
x p11…p1kmatch1
…
x pn1…pnkmatchn
[…废话…]
翻译:函数的一般绑定形式在语义上等同于等式(即简单模式绑定):
x=\x1…xk->
(p11,…,p1k)匹配1
…
(pn1,…,pnk)匹配n
其中席是新的标识符。
(强调矿山)
虽然函数定义在语义上等同于lambda&case表达式,但正如Mihai所建议的,它们不一定以这种方式编译
问题是,Haskell报告定义了函数声明,使得它们在等式的左侧必须具有相同数量的输入。这一点可以通过以下事实得到明确:k
在第1行和第n行函数声明上保持不变(暗示,在这两行之间的所有行)。这就是限制的原因;它与GHC的实施细节无关
博士
不允许这样做的选择只是风格的问题
这通常被认为是不好的形式。一组函数定义的参数数量不同通常表明存在错误。可以编写类型良好的函数,其算术数根据其参数的值而变化。这可能是一种少数运动,但它限制了左手边必须有相同的数字参数的r是一种人为的限制,更不用说讨厌了。的确,lhs不匹配通常是一个错误,但为什么不让类型系统捕捉它们呢?我认为这样更方便,可读性也不受影响。检查类型是否相同,并将id
转换为(\x->id x)
对编译器来说很容易,我想。允许不同数量的参数是完全合理的。而且也很容易编译。不允许的选择只是风格的问题。+1我自己也很想知道这一点。但是用一个参数调用foo
在两种情况下做的事情都是一样的。只需扩展一个简单的fu将一个方程转化为λ-表达式的nction定义在这里解释得很少,更重要的是,将多个方程的定义转化为具有多个case
选择的单个方程。当方程η-降低到不同程度时,这实际上不起作用。因此,左侧的模式匹配desugars到一个case表达式?@L01man:是的,我想这就是它的工作原理。我的错,我在想别的事情。用正确的解释更新了答案(感谢@leftaroundabout,它显示了我错在哪里)事实上,在核心中,我们只有模式匹配+1的case
表达式,这是唯一解决实际问题的表达式。