これが古い投稿であることは知っていますが、古き良き実装を実装したソリューションは見当たりませんでしたfold
。
まず、を使用して先頭の空白を削除しdropWhile
ます。次に、foldl'
と単純なクロージャを使用して、1回のパスで文字列の残りの部分を分析し、その分析に基づいて、その有益なパラメータをに渡すことができtake
ますreverse
。
import Data.Char (isSpace)
import Data.List (foldl')
trim :: String -> String
trim s = let
s' = dropWhile isSpace s
trim' = foldl'
(\(c,w) x -> if isSpace x then (c,w+1)
else (c+w+1,0)) (0,0) s'
in
take (fst trim') s'
変数c
は、吸収される必要のある空白と非空白の組み合わせを追跡し、変数は、w
削除される右側の空白を追跡します。
テスト実行:
print $ trim " a b c "
print $ trim " ab c "
print $ trim " abc "
print $ trim "abc"
print $ trim "a bc "
出力:
"a b c"
"ab c"
"abc"
"abc"
"a bc"