List 空列表的Haskell tail函数
我有一个函数的问题,它应该只返回列表的尾部。这些函数是myTail,即使输入是空列表,也应该给出一个可用的结果 我想了解所有3种方法:模式匹配、保护方程和条件表达式 这项工作: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_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
overtail xs
用于此目的?可能会对您有所帮助:您只需执行myTail=drop 1
模式匹配版本更像haskell。我知道,但这是一个练习;)与正常的尾部功能或模式匹配相比,使用这种方法是否有任何负面影响?@Lightbulb1请定义什么是“负面影响”,是副作用还是什么。“tail”和“drop1”之间的唯一区别是tail在空列表中抛出一个错误。感谢您的回复。我是从性能的角度考虑的。虽然我相信它是使用一个链表实现的,所以性能是相同的,但在用Haskell编写程序时,您不能考虑实现性能。用一种更具哲理的方式,命令式语言告诉编译器“如何做”,函数式语言告诉编译器“你想做什么”。如果性能是您的首要任务,那么最好选择ASM或C golang或类似产品。