2009-11-18 3 views
7

У меня проблема с функцией, которая должна возвращать только хвост списка. Эти функции являются myTail и должны давать полезный результат, даже если вход представляет собой пустой список.Функция хвоста Haskell для пустых списков

Я хочу понять все 3 способа: соответствие шаблона, охраняемое уравнение и условные выражения

это работает:

> myTail_pat :: [a] -> [a] 

> myTail_pat (x:xs) = xs 
> myTail_pat [] = [] 

Но это:

> myTail_guard (x:xs) | null xs = [] 
>    | otherwise = xs 

дает мне ошибку: Программу error: ошибка совпадения шаблонов: myTail_guard [] Как я могу объявить функцию без шаблонов?

спасибо.

+0

может помочь вам: http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html# Охранники – Artelius

+2

вы можете просто сделать 'myTail = drop 1' – newacct

+1

Соответствующая версия шаблона больше похожа на haskell в любом случае. – Rayne

ответ

15

Образец x:xs не соответствует пустым спискам. Вы должны были бы сделать:

myTail_guard xs 
    | null xs = [] 
    | otherwise = tail xs 
+0

Если вы хотите избежать 'tail xs', я думаю, вы можете заменить его на' xss where (_, xss) = xs' – Artelius

+3

@Artelius: это должно быть 'xss where (_ : xss) = xs'. – porges

+0

или ленивые узоры – PyRulez

2

падение 1 является безопасным

drop 1 [] 
-- result: []