2013-10-23 14 views
5

Angenommen, ich hätte die Zeichenfolge "HALLO WORLD" gibt es eine Möglichkeit, ich kann eine Funktion aufrufen, die das Zeichen 'O' in der Zeichenfolge durch das Zeichen 'X' ersetzt, so dass die neue Zeichenfolge aussehen würde "HELLX WXRLD"?Haskell ersetzt Zeichen in String

+1

möglich Duplikat [? Wie kann ich einen Teilstring eines Strings mit einem anderen in Haskell ersetzen, ohne Verwendung von externen Bibliotheken wie missingh] (http://stackoverflow.com/questions/14880299/how-can-i-replace-a-substring-of-a-string-with-another-in-haskell-without-using) – Orbling

+6

Haben Sie überhaupt gesucht, wie diese Frage gekommen ist viele Male. – Orbling

Antwort

26

Wie wäre:

let 
    repl 'o' = 'x' 
    repl c = c 
in map repl "Hello World" 

Wenn Sie später zusätzliche Zeichen ersetzen müssen, fügen Sie einfach Klauseln auf repl Funktion.

+0

Oh, ich verstehe. Meine Lösung ist in der Tat ein bisschen kompliziert. –

+2

Mustervergleich ist König. – reem

+0

Können Sie dies mit einem Lambda in einer Zeile tun? Wenn ja, noch ein +1 von mir :) – vikingsteve

1

Hier ist eine andere mögliche Lösung unter Verwendung von Teile und Herrsche:

replaceO [] = [] 
replaceO (x:xs) = 
    if x == 'O' 
    then 'X' : replaceO xs 
    else x : replaceO xs 

Zuerst stellen Sie die Randbedingung "replaceO [] = []".
Wenn die Liste leer ist, gibt es nichts zu ersetzen, eine leere Liste zurückgeben.

Als nächstes nehmen wir die Saite und teilen sie in Kopf und Schwanz. In diesem Fall 'H':"ELLOWORLD"
Wenn der Kopf gleich 'O' ist, wird er durch 'X' ersetzt. und wenden Sie die ReplaceO-Funktion auf den Rest der Zeichenfolge an.
Wenn der Kopf nicht gleich 'O' ist, wird der Kopf dorthin zurückgebracht, wo er ist, und die replaceO-Funktion auf den Rest der Zeichenfolge angewendet.

9

Entschuldigung für die Abholung dieses alten Threads, aber warum nicht Lambda-Ausdrücke verwenden?

λ> let replaceO = map (\c -> if c=='O' then 'X'; else c) 
λ> replaceO "HELLO WORLD" 
"HELLX WXRLD"` 
-2

Ich denke, das könnte nützlich sein.

main = print $ charRemap "Hello WOrld" ['O','o'] ['X','x'] 

charRemap :: [Char] -> [Char] -> [Char] -> [Char] 
charRemap [] _ _ = [] 
charRemap (w:word) mapFrom mapTo = 
    if snd state 
     then mapTo !! fst state : charRemap word mapFrom mapTo 
     else w : charRemap word mapFrom mapTo 
    where 
     state = hasChar w mapFrom 0 

hasChar :: Char -> [Char] -> Int -> (Int,Bool) 
hasChar _ [] _ = (0,False) 
hasChar c (x:xs) i | c == x = (i,True) 
        | otherwise = hasChar c xs (i+1) 
3

Alternative 1 - Mit missingh

Erstens:

import Data.List.Utils (replace) 

Dann nutzen:

replace "O" "X" "HELLO WORLD" 

Alternative 2 - Verwendung Control.Monad

Ein lustiger Bastard:

import Control.Monad (mfilter) 

replace a b = map $ maybe b id . mfilter (/= a) . Just 

Beispiel:

λ> replace 'O' 'X' "HELLO WORLD" 
"HELLX WXRLD" 

Alternative 3 - Verwendung, wenn

Amon Vorschläge wohl schönste war glaube ich! Keine Importe und einfach zu lesen und zu verstehen!

aber wählerisch zu sein - es gibt keine Notwendigkeit für Semikolon:

replace :: Eq a => a -> a -> [a] -> [a] 
replace a b = map $ \c -> if c == a then b else c