2016-05-19 22 views
1

文字列を分割する関数を探しています(たとえば、 "ab"、 "c"、 "3"、 "21")abc321c "をこの文字列(" ab "、" c "、" 3 "、" 21 "、" c ")に変換します。Haskell:複数の条件と文字列を条件とするブレーク関数

haskellのbreak関数は条件を1つしか取らず、文字列ではなくcharを取ります。リストの最初の文字にのみ適用します。

*Main> break ('-'==) "teasd-das-d" 
("teasd","-das-d") 
+1

それはあなたがこの機能が動作する方法は不明です。なぜ文字列 '' abc321 ''がそれを分割したのですか? – ApproachingDarknessFish

答えて

1

あなたはこのように明示的に書くことができます:

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 ||| (=='-')) ... 
0
あなたが正規表現-compatのライブラリにsplitRegexを探しているかもしれない

import Text.Regex 

> splitRegex (mkRegex "-") "eat-more-noodles" 
["eat", "more", "noodles"] 
> splitReges (mkRegex "(-|\\+)") "also+eat-barley" 
["also", "eat", "barley"] 

あなたが見ることができるように、正規表現が豊かなセパレータを可能にすることができます....