2009-11-18 11 views
7

リストの末尾のみを返す関数には問題があります。関数はmyTailであり、入力が空のリストであっても有用な結果が得られるはずです。パターンマッチング、警備式と条件式空リストのハスケルテール関数

この作品:

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

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

しかし、この:

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

は私にエラーを与える:

は、私はすべての3つの方法を理解したいプログラムをエラー:パターンマッチの失敗: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)= xs'である。 – porges

+0

または遅延パターン – PyRulez

2

ドロップ1が安全であることは

drop 1 [] 
-- result: []