Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的参数数和自由点数_Haskell_Arguments_Currying_Pointfree - Fatal编程技术网

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
表达式,这是唯一解决实际问题的表达式。