Haskellites的简单问题:Haskell是否迭代整个序列以获得最后一个值?具体来说,是否为这两个表达式执行了不同数量的指令?
Prelude> last "asdf"
'f'
Prelude> last "qwerty"
'y'
答案 0 :(得分:19)
是的,Haskell的列表是单链接的,因此last
需要遍历整个列表,使其运行时O(n)
。
答案 1 :(得分:7)
除了sepp2k所说的,这很容易确定:只需运行“last [1..1000000000]”并查看是否需要一段时间。正如所料,它确实如此。
答案 2 :(得分:3)
正如其他两个答案所说:是的,最后是标准列表上的O(n)操作。如果您正在处理文本数据,可以考虑使用提供O(1)text package的last function。如果你不处理文本数据,你可以查看bytestring或vector包。