2012-07-13 12 views
6
> magicFunction 'l' '_' "hello world" 
["he_lo world", "hel_o world", "hello wor_d"] 

Gibt es im Standard Prelude eine solche magische Funktion oder kann es leicht mit anderen Funktionen zusammengesetzt werden?Berechnung aller Möglichkeiten, ein Zeichen durch ein anderes zu ersetzen

Und nein, das sind keine Hausaufgaben, aber trotzdem, bitte verbringe nicht zu viel Zeit mit deiner eigenen komplizierten Lösung, ich würde das lieber selbst machen, als deine Zeit zu verschwenden;) Nur fragen, ob es drin ist Der Standard.


EDIT: Hier ist mein erster Versuch:

import Data.List (findIndices) 

replace i y xs = take i xs ++ y : drop (i+1) xs 

magicFunction x y xs = map (\i -> replace i y xs) (findIndices (== x) xs) 

es verbessert werden kann? Sicherlich muss so etwas wie replace im Standard sein? Ich habe replace :: Eq a => a -> a -> [a] -> [a] in Network.CGI.Protocol gefunden, aber es hat die falsche Signatur.

+0

Versuchen Sie, eine Gotteslästerung Filter-Bypass zu machen? XD – Mysticial

+0

Was ist falsch an der Signatur von 'replace'? Setze 'a ~ Char', also' [a] ~ String' und wir haben 'Eq Char', also was ist das Problem? – dave4420

+1

@ dave4420 Das erste Problem ist, dass es in 'Network.CGI.Protocol' ... Ziemlich zufällig als ein Import für diese Art von Funktionalität (die Sie finden _an geeigneteren Standorten) – Jedai

Antwort

2

Nein, es nicht so etwas wie magicFunction in den Standardbibliotheken ist. Aber es ist einfach, sich selbst zu schreiben. Wenn es nicht oft verwendet wird, ist es sinnlos, es in eine Bibliothek zu schreiben. Zusätzlich zu Ihrer Version und Hinweis Daniel Wagner mit tails und inits, hier ist eine einfache Implementierung:

magicFunction find replace = init . helper 
    where 
    helper (c:cs) = if c == find then ((replace:cs):) else id $ map (c:) (helper cs) 
    helper [] = [[]] 
1

In der Standardverteilung gibt es nichts Vergleichbares. Allerdings gibt es einen bekannten Trick, der den Beginn eine Lösung bilden könnte:

Prelude Data.List> (\xs -> zip (inits xs) (tails xs)) "Hello, world!" 
[("","Hello, world!"),("H","ello, world!"),("He","llo, world!"),("Hel","lo, world!"),("Hell","o, world!"),("Hello",", world!"),("Hello,"," world!"),("Hello, ","world!"),("Hello, w","orld!"),("Hello, wo","rld!"),("Hello, wor","ld!"),("Hello, worl","d!"),("Hello, world","!"),("Hello, world!","")] 
Verwandte Themen