strip
Haskellで文字列を削除する方法(先頭/末尾の文字を削除する方法)については何も見つかりませんでした。また、そのような関数や関数を見つける場所がありchomp
ません(間違っている場合は修正してください)。
私は何をするつもりですか?
strip
Haskellで文字列を削除する方法(先頭/末尾の文字を削除する方法)については何も見つかりませんでした。また、そのような関数や関数を見つける場所がありchomp
ません(間違っている場合は修正してください)。
私は何をするつもりですか?
をご覧くださいData.Text
。sなどの Prelude リストを使用するものはString
、通常、特に のような関数ではパフォーマンスが低下しますstripR
。これは過去からの間違いであると考える人もいます。なぜなら、多くの (そうでなければ賢明な) インターフェイスが、String
テキスト データに単方向にリンクされた文字のリスト ( ) を使用することの非効率性に影響を受けているからです。
探している関数は、順番に次のとおりです: dropWhile
、dropWhileEnd
、dropAround
、stripStart
、。stripEnd
strip
文字の等価性に基づいてストリッピングするための特定の関数はないことに注意してください。のような非常に一般的に使用されるものdropX
でない限り、述語でエイリアシングしても実際には何も得られません。Data.Char.isSpace
まず、の代わりにText
(text
パッケージから)を使用する必要があります。String
これtext
は、はるかに効率的であるためです。
また、text
すでにこの機能があります:
-- Remove leading and trailing white space from a string.
strip :: Text -> Text
strip
より一般的なアプローチは、関数に述語を渡すことstripL isSpace
です。たとえば、先頭の空白をすべて削除することができます。
ただし、stripL
のエイリアスはdropWhile
.
端を取り除くために、潜在的により効率的なバージョンはfoldr
、
stripR :: (a -> Bool) -> [a] -> [a]
stripR pred = foldr keepOrDrop []
where
keepOrDrop c xs
| pred c = case xs of
[] -> []
_ -> c:xs
| otherwise = c:xs
入力リスト全体をトラバースせずに出力の生成を開始でき、入力の述語を満たす要素の長い実行がない場合に効率的です。
これを実現するための3つの関数と3つのcurrifiedエイリアス関数を次に示します。
stripL :: Char -> String -> String
stripL x = dropWhile (==x)
stripR :: Char -> String -> String
stripR x = reverse . stripL . reverse
strip :: Char -> String -> String
strip x = stripL x . stripR x
chompL :: String -> String
chompL = stripL ' '
chompR :: String -> String
chompR = stripR ' '
chomp :: String -> String
chomp = strip ' '
どう思いますか?そのような機能をに追加することは可能Data.String
ですか?