【问题标题】:Haskell tail function for empty lists用于空列表的 Haskell 尾函数
【发布时间】:2009-11-18 22:10:20
【问题描述】:

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

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

这行得通:

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

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

但是这个:

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

给我错误:程序错误:模式匹配失败:myTail_guard [] 如何声明没有模式的函数?

谢谢。

【问题讨论】:

标签: list haskell tail


【解决方案1】:

模式x:xs 与空列表不匹配。你需要这样做:

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

【讨论】:

  • 如果你想避免tail xs我想你可以用xss where (_, xss) = xs替换它
  • @Artelius:应该是xss where (_:xss) = xs
  • 或惰性模式
  • 有什么理由使用xss where (_:xss) = xs而不是tail xs来达到这个目的?
【解决方案2】:

第一滴是安全的

drop 1 []
-- result: []

【讨论】:

  • 使用这种方法与普通的尾函数或模式匹配有什么负面影响吗?
  • @Lightbulb1 请定义什么是“负面影响”,是副作用还是什么。 “tail”和“drop 1”之间的唯一区别是tail在空列表上抛出错误。
  • 感谢您的回复。我在考虑性能。
  • 虽然我相信它是使用链表实现的,所以性能是一样的,但是在 Haskell 中编写程序时一定不要考虑实现性能。以一种更哲学的方式,在命令式语言中,您告诉编译器“如何去做”,而在功能性语言中,您告诉编译器“您想要完成什么”。如果性能是您的首要任务,那么宁愿采用 ASM 或 C golang 或类似的东西。
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多