list - 这段 Haskell 代码高效吗?

标签 list data-structures haskell performance

作为初学者练习,我实现了以下函数来查找列表中的第 n 个元素:

elem_at (h:_) 0 = h  
elem_at (_:t) n = elem_at t (n-1)  
elem_at _ _     = error "Index out of bounds"

但是,如果我调用:elem_at [1,2,3,4] 5,只有在遍历整个列表后才会返回“Index out of bounds”是否正确,以便最后一行与模式匹配_ _ 与 [] 1?更一般地说,如果列表很大,那不是性能问题吗? ghc 能否以某种方式优化这种情况?

最佳答案

事实上,这几乎是索引列表的规范方式。您需要添加检查负数

elem_at xs n | n < 0 =  error "elem_at: negative index"

您可以为空列表添加特定的匹配项:

elem_at [] _         =  error "elem_at: index too large"

以及基础和归纳案例:

elem_at (x:_)  0         =  x
elem_at (_:xs) n         =  elem_at xs (n-1)

并且您已经获得了列表索引的 Prelude 定义,(!!) 运算符。

可以通过 worker wrapper 生成一个稍微更高效的版本,将索引测试 float 到顶层。

关于list - 这段 Haskell 代码高效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051796/

相关文章:

python - 为什么可以在使用变量定义函数后定义变量?

python - 为什么 `int in List[List[int]]` 返回 `False` 但 `np.int in List[List[int]]` 返回 `True` ?

algorithm - Fredman 和 Tarjan 论文中 Fibonacci 堆的 DecreaseKey 的原始设计

c - 删除项目 - 哈希表

mysql - haskell `hdbc` ODBC 连接立即为远程 MySQL 实例处理

haskell - 让一个简单的 Haskell HsLua 示例工作

java - iText/列表 : How to remove symbol from list?

list - 这是使用 cons 的列表的定义吗?

algorithm - 为什么 Dijkstra 的算法使用减少键?

haskell - 如何仅编译具有 '-auto' 成本中心的某些模块?