2016-05-19 3 views
1

Ich suche nach einer Funktion, die eine Zeichenkette unterbricht (basierend auf eigenen Bedingungen zB "ab", "c", "3", "21") "abc321c in diese Zeichenfolge ("ab", "c", "3", "21", "c").Haskell: Break-Funktion mit mehreren Bedingungen und einem String als Bedingung

Die Break-Funktion in Haskell nimmt nur eine Bedingung (und nimmt nur ein Zeichen und nicht eine Zeichenfolge) und nur auf das erste Zeichen in der Liste anwenden.

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

Es ist unklar, wie Sie diese Funktion bedienen möchten . Warum wurde der String "abc321" so aufgeteilt, wie er war? – ApproachingDarknessFish

Antwort

1

Sie können es so explizit schreiben:

break (\c -> (isUpper c || isDigit c)) ... 

oder so:

break (\c -> or $ map ($c) [isUpper, isDigit]) ... 

was bedeutet, wenn Sie diese Hilfsfunktion hatte:

orF :: [a -> Bool] -> a -> Bool 
orF fs a = or $ map ($a) fs 

dann der Anruf break wird:

break (orF [isUpper,isDigit, (=='-')]) ... 

Es gibt wahrscheinlich einige Kategorie-Theorie Operatoren, die hier verwendet werden könnte, aber dies ist ein direkter Ansatz.

aktualisieren

Wenn Sie Lust bekommen möchten, können Sie dies tun:

import Control.Applicative 

break (liftA2 (||) isUpper isDigit) ... 

Zur Kette mehr als eine Bedingung zusammen, vielleicht einen Operator definieren:

(|||) = liftA2 (||) 

und dann:

break (isUpper ||| isDigit ||| (=='-')) ... 
für splitRegex in der Regex-compat Bibliothek
0

Sie könnten

import Text.Regex 

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

Wie Sie sehen können suchen, können reguläre Ausdrücke für reichere Separatoren ermöglichen ....

Verwandte Themen