1

リストの最後にあるすべてのゼロを削除したいとします。

removeEndingZeros :: (Num a, Eq a) => [a] -> [a]
removeEndingZeros (xs ++ [0]) = removeEndingZeros xs
removeEndingZeros xs          = xs

(++)これは、引数の演算子のために機能しません。パターン マッチングを使用してリストの末尾を判断するにはどうすればよいですか?

4

1 に答える 1

7

これを行う関数がありますData.List

dropWhileEnd :: (a -> Bool) -> [a] -> [a]
dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) []

したがって、末尾のゼロを削除できます

dropWhileEnd (== 0)

別の非常によく似た関数は、次のように実装できます。

dropWhileEnd2 :: (a -> Bool) -> [a] -> [a]
dropWhileEnd2 p = foldr (\x xs -> if null xs && p x then [] else x : xs) []

dropWhileEnd2 pは とまったく同じセマンティクスを持ちますreverse . dropWhile p . reverseが、一定の係数だけ高速になることが合理的に期待できます。dropWhileEnd他のものとは比較にならないほど厳密な特性が異なります (ある意味ではより厳密であり、他の点ではそれほど厳密ではありません)。

それぞれがより速くなることが期待できる状況を把握できますか?

于 2016-03-15T05:30:39.183 に答える