2009-11-18 55 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: []