2009-11-18 54 views
7

我有一個函數應該只返回列表的尾部的問題。這些函數是myTail,即使輸入是空列表,也應該提供可用的結果。Haskell尾空函數爲空列表

我想明白了所有3種方式:模式匹配,守衛方程和條件表達式

這個工程:

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

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

但這:

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

給我的錯誤:程序錯誤:模式匹配失敗:myTail_guard [] 我該如何聲明沒有模式的函數?

謝謝。

+0

可以幫助你:http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html#衛兵 – Artelius 2009-11-18 22:28:35

+2

你可以'myTail = drop 1' – newacct 2009-11-18 23:40:04

+1

模式匹配版本更像haskell一樣。 – Rayne 2009-11-19 08:58:59

回答

15

模式x:xs與空列表不匹配。你需要做的事:

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

如果你想避免'尾巴xs'我想你可以用'xss替換它在哪裏(_,xss)= xs' – Artelius 2009-11-18 22:20:09

+3

@Artelius:那應該是'xss where(_ :xss)= xs'。 – porges 2009-11-18 23:13:16

+0

或懶惰的模式 – PyRulez 2017-12-16 02:57:46

2

下降1是安全的

drop 1 [] 
-- result: []