Haskell函数的参数数量

时间:2017-11-01 16:51:19

标签: haskell

当我尝试使用ghc编译它时,它会抱怨函数定义左侧的参数数量不同。

module Example where

import Data.Maybe

from_maybe :: a -> Maybe a -> a
from_maybe a Nothing = a
from_maybe _ = Data.Maybe.fromJust

我想知道这是否是ghc限制。我试着看看我 可以找到有关Haskell 2010中参数数量的任何信息 报告但我没有成功。

这是合法的Haskell还是不是?如果不是,该参数计数在哪里 限制列出?

2 个答案:

答案 0 :(得分:18)

这不合法。该限制描述于 Haskell 2010 Report

  

4.4.3.1功能绑定

     

[...]

     

请注意,定义函数的所有子句必须是连续的,并且每个子句中的模式数必须相同。

答案 1 :(得分:-1)

answer中的melpomene是语法规则的总和。在这个答案中,我想尝试描述为什么会出现这种情况。

从程序员的角度来看,问题中的语法似乎很合理。存在第一特定情况,其由第二参数中的值标记。然后有一个通用的解决方案,减少到现有的功能。这两种模式本身都是有效的,为什么它们不能共存?

所有模式必须捕获完全相同参数的语法规则是haskell是一种惰性语言的必要结果。懒惰意味着在需要之前不会评估参数值。

让我们看看当我们讨论一个函数时会发生什么,即它提供的函数少于声明中的参数数量。当发生这种情况时,haskell会生成一个匿名函数*,它将完成该函数并将第一个参数存储在该函数的范围内,而不对其进行评估

最后一部分很重要。对于具有不同参数数量的函数,有必要对其中一些参数进行评估,以选择匹配哪种模式,但不评估它们。

换句话说,编译器需要知道在评估模式之前需要多少参数才能在模式中进行选择。因此,虽然看起来我们不需要添加额外的_,但编译器需要它在那里。

顺便说一句,参数出现的顺序可以对函数的实现和使用的容易程度产生很大的影响。请参阅我的问题Ordering of parameters to make use of currying的答案以获取建议。如果在示例函数上反转顺序,则只能使用一个命名点来实现。

from_maybe :: Maybe a -> a -> a
from_maybe Nothing = id
from_maybe (Just x) = const x

*:像GHC这样的实现在这种情况下实际上会受到优化,并且可能无法正常工作,但最终结果必须与它一样。