在Haskell中编写(init,last)的最有效方法

时间:2015-12-19 01:38:14

标签: haskell

我是Haskell的新手,所以作为练习,我想实现一个类似于uncons的函数,该函数返回列表中的initlast元素。编写此函数的简便方法是

initLast :: [a] -> ([a], a)
initLast xs = (init xs, last xs)

我是编写haskell程序的新手,但这对我来说似乎效率低下,因为它必须遍历列表两次。我提出了另一个我认为可能更好的功能,因为它不会多次遍历列表:

initLast' :: [a] -> ([a], a)
initLast' [x] = ([], x)
initLast' (x:xs) = let (xs', y) = initLast' xs
                   in (x:xs', y)

但事实证明,当我在ghci中运行这些时,我发现第二个版本的速度是传输速度的两倍,并且使用了大约3倍的内存!

ghci> :set +s
ghci> snd (initLast [1..1000000])
1000000
(0.28 secs, 122242144 bytes)
ghci> snd (initLast' [1..1000000])
1000000
(0.71 secs, 434147544 bytes)

问题:

  1. 为什么第二个版本的效率会降低?
  2. 是否有更有效的方式来实施initLast

0 个答案:

没有答案