2

我刚开始使用 Haskell 并偶然发现了一个问题。根据 Haskell 的说法,我有一个模式匹配失败,但我看不到如何。这是我尝试执行的代码:

statistics ::   [Int] -> (Int, Int, Int)
statistics [gradelist] = ( amountParticipants, average, amountInsufficient)
                        where
                            amountParticipants= length [gradelist]
                            average= sum[gradelist] `div` amountParticipants
                            amountInsufficient= length [number| number<- [gradelist], number<6]

我称“统计”为:

statistics[4,6,4,6]

这会导致模式匹配失败,而我希望看到: (4, 5, 2)

statistics[6]

给出答案:( 1, 6, 0 ) (这是正确的)。有人能告诉我为什么我的第一个电话会导致这种模式匹配吗?因为我很确定我会给出一个列表作为参数

4

3 回答 3

7

如果你写你是针对一个包含唯一元素的单例statistics [gradelist] = ...列表进行模式匹配,称为. 因此,您的函数仅针对长度正好为 1 的列表定义(例如);对于空列表 ( ) 或具有两个或多个元素的列表(例如 ),它是未定义的。gradelist[6][][4,6,4,6]

您的函数的正确版本将读取

statistics :: [Int]     -> (Int, Int, Int)
statistics    gradelist =  (amountParticipants, average, amountInsufficient)
  where
    amountParticipants = length gradelist
    average            = sum gradelist `div` amountParticipants
    amountInsufficient = length [number| number <- gradelist, number < 6]

正如@thoferon 所说,您还需要对gradelist空的情况进行特殊安排,以避免在计算时被零除average

于 2013-03-26T13:54:23.310 回答
2

只需如前所述替换您[gradelist]的 's即可。gradelist此外,您可能希望使用 [] 匹配空列表,以避免在 中除以零average,例如:

statistics [] = (0,0,0)
于 2013-03-26T14:00:03.303 回答
1

模式中的列表语法[ ]解构列表。该模式[gradelist]匹配一​​个只包含一个值的列表,并命名列表中的值gradelist。如果您尝试使用包含四个值的列表调用该函数,则会出现模式匹配失败。

要匹配一个值而不解构它,请使用变量作为模式。

于 2013-03-26T13:56:36.867 回答