Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 空列表的Haskell tail函数_List_Haskell_Tail - Fatal编程技术网

List 空列表的Haskell tail函数

List 空列表的Haskell tail函数,list,haskell,tail,List,Haskell,Tail,我有一个函数的问题,它应该只返回列表的尾部。这些函数是myTail,即使输入是空列表,也应该给出一个可用的结果 我想了解所有3种方法:模式匹配、保护方程和条件表达式 这项工作: > myTail_pat :: [a] -> [a] > myTail_pat (x:xs) = xs > myTail_pat [] = [] 但这是: > myTail_guard (x:xs) | null xs = [] > | otherw

我有一个函数的问题,它应该只返回列表的尾部。这些函数是myTail,即使输入是空列表,也应该给出一个可用的结果

我想了解所有3种方法:模式匹配、保护方程和条件表达式

这项工作:

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

> myTail_pat (x:xs) = xs
> myTail_pat [] = []
但这是:

> myTail_guard (x:xs)   | null xs = []
>               | otherwise = xs
给我错误:程序错误:模式匹配失败:myTail_guard[] 我如何声明没有模式的函数


谢谢。

模式
x:xs
与空列表不匹配。您需要执行以下操作:

myTail_guard xs
  | null xs   = []
  | otherwise = tail xs
1号降落是安全的

drop 1 []
-- result: []

如果你想避免
尾部xs
我想你可以用
xss-where(,xss)=xs
@Artelius:那应该是
xss-where(:xss)=xs xs
。或者懒惰模式。有人有什么理由使用
xss-where(:xss)=xs
over
tail xs
用于此目的?可能会对您有所帮助:您只需执行
myTail=drop 1
模式匹配版本更像haskell。我知道,但这是一个练习;)与正常的尾部功能或模式匹配相比,使用这种方法是否有任何负面影响?@Lightbulb1请定义什么是“负面影响”,是副作用还是什么。“tail”和“drop1”之间的唯一区别是tail在空列表中抛出一个错误。感谢您的回复。我是从性能的角度考虑的。虽然我相信它是使用一个链表实现的,所以性能是相同的,但在用Haskell编写程序时,您不能考虑实现性能。用一种更具哲理的方式,命令式语言告诉编译器“如何做”,函数式语言告诉编译器“你想做什么”。如果性能是您的首要任务,那么最好选择ASM或C golang或类似产品。