Итак, у меня есть функция, которая берет список списков и берет начало каждого списка и добавляет его в другой список. У меня есть защитники, которые, как я думал, охватывали все проблемы, но это не так. 't, может ли кто-нибудь понять, почему это может дать мне исключение.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 (take 1)'. –
Не могу не упомянуть, что когда вы соблазняетесь использовать 'length' в списке, вы обычно делаете ошибку. – dfeuer