为空列表案例的每个输入生成错误消息

时间:2017-04-29 11:40:07

标签: haskell

我在第一学期使用haskell进行第二次学习编码,所以我对编码很新。我的问题是,我测试的每个输入,无论是否为空,都会为空案例生成错误消息,为什么会这样?

为清晰起见,添加了类型类。这也是作业的一部分,所以请仅指导我这一个错误:')

type Histogram a = Map a Int
inc :: Ord a => Histogram a -> a -> Histogram a

create
  :: Ord a
  => Histogram a -> [a] -> Histogram a
create h (head:restOfString) = create (inc h head) restOfString
create h [head]              = inc h head
create h []                  = error "No elements in string"

2 个答案:

答案 0 :(得分:2)

这是错误的:

create h (head:restOfString) = ...
create h [head]              = ...

传递仅包含一个元素的列表时,第一个分支匹配,restOfString为空。因此,永远不会采取第二个分支。

将第二行放在第一位。

如果您使用-Wall打开警告,GHC会警告许多潜在问题,包括此问题。我推荐它。

答案 1 :(得分:0)

前两个模式重叠,因此第一个模式总是优先于第二个模式。交换它们。

这会在GHC中默认触发警告,记得阅读编译器的输出。为了获得更好的编码体验,建议您启用-Wall