2015-11-23 32 views
1

所以我有一个函数,它需要列表的列表,并将每个列表的头部并将其添加到另一个列表,我有警卫,我认为涵盖所有问题,但它doesn任何人都不明白为什么它可能会给我一个例外。Haskell:函数中的非穷举模式

makeL :: (Eq a) => [[a]]->[a] -> [a] 
makeL (h:t) l 
    | length (concat (h:t)) == 0 = l 
    | length h == 0 && length t /= 0 = makeL t l 
    | length h /= 0 && length t == 0 = l++[head h] 
    | otherwise = makeL t (l++[head h]) 

当我在前奏中玩弄它时,我无法复制错误。但是当我运行程序,如果[[a]]等于[[],[],[],[],[]]那么它给出了错误,我认为

+1

无关:这种“基于警戒的”反模式在SO上最近似乎很受欢迎。有人应该写一篇“被认为是有害的警卫”的论文...... – chi

+1

这并没有解决你的问题,但我不禁要提出它:你可能会喜欢'concatMap(取1)'。 –

+1

我不禁要提到,当你试图在列表中使用'length'时,你通常会犯一个错误。 – dfeuer

回答

4

makeL (h:t) l其中专门列出的名单有头和尾的情况下比赛,但它不匹配空列表(没有头)。

作为最低限度,你需要添加一个以空单交易的情况下:

makeL [] l = -- implementation goes here 
+0

在程序中它不能得到'[]',它将会有[[],[],[],[]]。但我试过你的建议,它仍然给出了错误 –

+0

它给了哪个错误? –

+2

“在程序中它不能得到'[]'它将会有[[],[],[],[]]”。您可能知道这一点,但GHC不会,因此它会警告您非详尽的模式。 –

0

我认为这将模式工作,而不是用病房:

makeL :: (Eq a) => [[a]]->[a] -> [a] 
makeL [] l    = l -- base case, empty list return l 
makeL ([]:xs) l   = makeL xs l --case the list inside the list is empty, continue with the rest of the list 
makeL ((x:xxs):xs) l = makeL xs l++[x] --if the list in the list have a head append to l and continue with the list 
相关问题