作为初学者练习,我实现了以下函数来查找列表中的第 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/