2016-04-28 13 views
1

Betrachten Sie den folgenden mehrzeiligen String S:Wie werden diese String-Matching-Funktionen in Clojure (Script) durchgeführt?

apple 
banana berry 
cantelope 

Ich versuche clojure Funktionen zu schreiben/finden, das ich in diesem Beitrag or-match und and-match nennen. Hier sind einige Beispiele, was sie tun sollten:

(or-match S "apple" "berry") 

;; should return the two line string: 
;; apple 
;; banana berry 

(and-match S "apple" "berry") ; should return nil 

(and-match S "banana berry") ; should return a single line containing "banana berry" 

Wie Sie solche Funktionen in clojure (Skript) machen?

+0

Es ist nichts falsch daran, aber ich bin neugierig, warum Sie die gleiche Frage sowohl auf die Haskell und Clojure-Tags stellen. Versuchen Sie zu entscheiden, welche Sprache für eine Aufgabe oder etwas verwendet werden soll? – amalloy

+1

Ja - ich vergleiche, wie diese beiden Sprachen dieses Problem angehen. Ich habe bereits etwas in clojure mit einem anderen Ansatz erstellt und wechsle zu Haskell (eine neue Sprache für mich) und möchte diese bessere Technik verwenden (vergleiche, wie die Lösung in jeder Sprache auf dem Weg aussieht!) – George

Antwort

2

Sie können, dass jeder überprüfen/jeder Kandidat in einem String vorhanden ist:

user> (defn or-match [s & items] 
     (filter (fn [line] 
        (some #(clojure.string/includes? line %) 
         items)) 
       (clojure.string/split-lines s))) 
#'user/or-match 

user> (or-match "apple\nbanana berry\ncantelope" 
       "apple" "berry") 
("apple" "banana berry") 

user> (defn and-match [s & items] 
     (filter (fn [line] 
        (every? #(clojure.string/includes? line %) 
          items)) 
       (clojure.string/split-lines s))) 
#'user/and-match 

user> (and-match "apple\nbanana berry\ncantelope" 
       "apple" "berry") 
() 

user> (and-match "apple\nbanana berry\ncantelope" 
       "banana berry") 
("banana berry") 

und da diese Funktionen unterscheiden sich nur durch eine Funktion (some vs every?), können Sie es verallgemeinern:

user> (defn get-lines-matcher [check] 
     (fn [s & items] 
      (filter (fn [line] 
        (check #(clojure.string/includes? line %) items)) 
        (clojure.string/split-lines s)))) 
#'user/get-lines-matcher 

user> (def and-match (get-lines-matcher every?)) 
#'user/and-match 

user> (def or-match (get-lines-matcher some)) 
#'user/or-match 

user> (or-match "apple\nbanana berry\ncantelope" 
       "apple" "berry") 
("apple" "banana berry") 

user> (or-match "apple\nbanana berry\ncantelope" 
       "apple" "berry") 
("apple" "banana berry") 

user> (and-match "apple\nbanana berry\ncantelope" 
       "apple" "berry") 
() 

user> (and-match "apple\nbanana berry\ncantelope" 
       "banana berry") 
("banana berry") 

user> (and-match "apple\nbanana berry\ncantelope" 
       "banana" "berry") 
("banana berry") 
Verwandte Themen