我在第一学期使用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"
答案 0 :(得分:2)
这是错误的:
create h (head:restOfString) = ...
create h [head] = ...
传递仅包含一个元素的列表时,第一个分支匹配,restOfString
为空。因此,永远不会采取第二个分支。
将第二行放在第一位。
如果您使用-Wall
打开警告,GHC会警告许多潜在问题,包括此问题。我推荐它。
答案 1 :(得分:0)
前两个模式重叠,因此第一个模式总是优先于第二个模式。交换它们。
这会在GHC中默认触发警告,记得阅读编译器的输出。为了获得更好的编码体验,建议您启用-Wall
。