リストの最後にあるすべてのゼロを削除したいとします。
removeEndingZeros :: (Num a, Eq a) => [a] -> [a]
removeEndingZeros (xs ++ [0]) = removeEndingZeros xs
removeEndingZeros xs = xs
(++)
これは、引数の演算子のために機能しません。パターン マッチングを使用してリストの末尾を判断するにはどうすればよいですか?
リストの最後にあるすべてのゼロを削除したいとします。
removeEndingZeros :: (Num a, Eq a) => [a] -> [a]
removeEndingZeros (xs ++ [0]) = removeEndingZeros xs
removeEndingZeros xs = xs
(++)
これは、引数の演算子のために機能しません。パターン マッチングを使用してリストの末尾を判断するにはどうすればよいですか?
これを行う関数があります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
他のものとは比較にならないほど厳密な特性が異なります (ある意味ではより厳密であり、他の点ではそれほど厳密ではありません)。
それぞれがより速くなることが期待できる状況を把握できますか?