所以我有一个函数,它需要列表的列表,并将每个列表的头部并将其添加到另一个列表,我有警卫,我认为涵盖所有问题,但它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]]
等于[[],[],[],[],[]]
那么它给出了错误,我认为
无关:这种“基于警戒的”反模式在SO上最近似乎很受欢迎。有人应该写一篇“被认为是有害的警卫”的论文...... – chi
这并没有解决你的问题,但我不禁要提出它:你可能会喜欢'concatMap(取1)'。 –
我不禁要提到,当你试图在列表中使用'length'时,你通常会犯一个错误。 – dfeuer