2015-09-10 3 views
4

я написал свою собственную take функцию в Haskell, как это:As (@) шаблон в Haskell

take' :: (Integral n, Eq a) => n -> [a] -> [a] 
take' n lst 
    | n <= 0 = [] 
    | lst == [] = [] 
    | otherwise = (head lst) : (take' (n-1) $ tail lst) 

и он хорошо работает.

Но когда я пытаюсь написать ту же самую функцию, используя в качестве (@) модель в качестве аргументов функции, то кажется, что функция не распознает второй вариант сторожевую:

take' :: (Integral n, Eq a) => n -> [a] -> [a] 
take' n [email protected](hd:tl) 
    | n <= 0 = [] 
    | lst == [] = [] 
    | otherwise = hd : (take' (n-1) $ tl) 

Когда я пытаюсь take' 20 [] в ghci Я получаю ошибку Non-exhaustive patterns in function take'.

Что я делаю неправильно?

Спасибо, Špela.

ответ

9

Посмотрите здесь:

lst == [] = [] 

lst никогда не может быть равен [], потому что вы сказали, что lst = hd:tl. Вместо этого вы можете разбить эту ветку из охранника и на независимое совпадение шаблонов, чтобы получить полное покрытие. (Вы также можете отказаться от Eq ограничения, как только вы сделаете это.)

При вызова take' 20 [], он пытается найти модель, которая соответствует этому, но вы не написали одно: hd:tl может не совпадать с []. И после того, как шаблон не будет соответствовать, он не будет смотреть на охранников для этого шаблона.

+0

Я полностью пропустил это! Благодаря! – Spela

Смежные вопросы