文字列を分割する関数を探しています(たとえば、 "ab"、 "c"、 "3"、 "21")abc321c "をこの文字列(" ab "、" c "、" 3 "、" 21 "、" c ")に変換します。Haskell:複数の条件と文字列を条件とするブレーク関数
haskellのbreak関数は条件を1つしか取らず、文字列ではなくcharを取ります。リストの最初の文字にのみ適用します。
*Main> break ('-'==) "teasd-das-d"
("teasd","-das-d")
文字列を分割する関数を探しています(たとえば、 "ab"、 "c"、 "3"、 "21")abc321c "をこの文字列(" ab "、" c "、" 3 "、" 21 "、" c ")に変換します。Haskell:複数の条件と文字列を条件とするブレーク関数
haskellのbreak関数は条件を1つしか取らず、文字列ではなくcharを取ります。リストの最初の文字にのみ適用します。
*Main> break ('-'==) "teasd-das-d"
("teasd","-das-d")
あなたはこのように明示的に書くことができます:
break (\c -> (isUpper c || isDigit c)) ...
またはこのよう:その後、
orF :: [a -> Bool] -> a -> Bool
orF fs a = or $ map ($a) fs
:あなたはこのヘルパー関数を持っていた場合は意味
break (\c -> or $ map ($c) [isUpper, isDigit]) ...
break
コールは次のようになります。
break (orF [isUpper,isDigit, (=='-')]) ...
おそらくここで使用できるカテゴリ理論演算子がいくつかありますが、これは直接的なアプローチです。
更新
あなたは空想を取得したい場合は、あなたがこれを行うことができます、一緒にチェーンに複数の条件を
import Control.Applicative
break (liftA2 (||) isUpper isDigit) ...
をおそらく演算子を定義します。
(|||) = liftA2 (||)
次に:
break (isUpper ||| isDigit ||| (=='-')) ...
import Text.Regex
> splitRegex (mkRegex "-") "eat-more-noodles"
["eat", "more", "noodles"]
> splitReges (mkRegex "(-|\\+)") "also+eat-barley"
["also", "eat", "barley"]
あなたが見ることができるように、正規表現が豊かなセパレータを可能にすることができます....
それはあなたがこの機能が動作する方法は不明です。なぜ文字列 '' abc321 ''がそれを分割したのですか? – ApproachingDarknessFish