下面提供了3个函数,这些函数可以找到列表中的最后一个但第二个元素。一个使用last . init似乎比其他人快得多。我似乎不知道为什么。
为了进行测试,我使用了输入列表[1..100000000](一亿)。最后一个几乎立即运行,而其他则需要几秒钟。
-- slow
myButLast :: [a] -> a
myButLast [x, y] = x
myButLast (x : xs) = myButLast xs
myButLast _ = error "List too short"
-- decent
myButLast' :: [a] -> a
myButLast' = (!! 1) . reverse
-- fast
myButLast'' :: [a] -> a
myButLast'' = last . init
Run Code Online (Sandbox Code Playgroud) haskell ×1