空列表中的非详尽模式错误

时间:2012-03-08 02:51:34

标签: haskell

我正在为内存声明一个新类型,然后使用一个函数来更新它。当我向列表中添加值时,程序编译并正常工作,但如果我的列表为空,则会收到错误“函数update中的非详尽模式”。这是我的代码,如果你能帮助我的话:

type Name = [Char] 
type Memory = [(Name,Integer)] 

update :: Name ->Integer -> Memory -> Memory
update n x (h:t)
    |(fst h==n) =(n,x):t
    |((h:t) == []) = (n,x):[]
    |(fst t==x) = h:(n,t)
    |(t==[]) =  h:(n,x):[]
    |otherwise = h:update n x t 

1 个答案:

答案 0 :(得分:5)

这是因为您的代码未涵盖空列表案例。 特别是:h:t == []永远不会评估为Trueh:t是一种仅匹配非空列表的模式:它将h绑定到列表的头部,将t绑定到列表的其余部分。

所以你的功能需要处理三种情况:

update n x [] = (n,x):[]                        -- empty list
update n x (h:t) | n == fst h = (n,x):t         -- key equal to n
                 | otherwise  = h:update n x t  -- key not equal to n