6

stripHaskellで文字列を削除する方法(先頭/末尾の文字を削除する方法)については何も見つかりませんでした。また、そのような関数や関数を見つける場所がありchompません(間違っている場合は修正してください)。

私は何をするつもりですか?

4

4 に答える 4

8

をご覧くださいData.Text。sなどの Prelude リストを使用するものはString、通常、特に のような関数ではパフォーマンスが低下しますstripR。これは過去からの間違いであると考える人もいます。なぜなら、多くの (そうでなければ賢明な) インターフェイスが、Stringテキスト データに単方向にリンクされた文字のリスト ( ) を使用することの非効率性に影響を受けているからです。

探している関数は、順番に次のとおりです: dropWhiledropWhileEnddropAroundstripStart、。stripEndstrip

文字の等価性に基づいてストリッピングするための特定の関数はないことに注意してください。のような非常に一般的に使用されるものdropXでない限り、述語でエイリアシングしても実際には何も得られません。Data.Char.isSpace

于 2013-01-09T22:39:59.320 に答える
5

まず、の代わりにText(textパッケージから)を使用する必要があります。Stringこれtextは、はるかに効率的であるためです。

また、textすでにこの機能があります:

-- Remove leading and trailing white space from a string.
strip :: Text -> Text
于 2013-01-09T22:38:22.020 に答える
3

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

入力リスト全体をトラバースせずに出力の生成を開始でき、入力の述語を満たす要素の長い実行がない場合に効率的です。

于 2013-01-09T22:39:39.267 に答える
1

これを実現するための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ですか?

于 2013-01-09T22:27:32.243 に答える