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

Czy istnieje taka magiczna funkcja w standardowym Preludium, czy może być łatwo skomponowana z innymi funkcjami?Obliczanie wszystkich możliwości zamiany jednego znaku przez inny

I nie, to nie jest praca domowa, ale mimo to nie poświęcaj zbyt dużo czasu na samodzielne toczenie własnego skomplikowanego rozwiązania, wolałbym to zrobić samemu niż marnować twój czas;) Po prostu pytając, czy jest w standard.


EDIT: Oto moja pierwsza próba:

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) 

można go poprawić? Z pewnością coś takiego jak replace musi być w standardzie? Znalazłem replace :: Eq a => a -> a -> [a] -> [a] w Network.CGI.Protocol, ale ma on nieprawidłową sygnaturę.

+0

Czy starasz się zrobić obejście filtru wulgaryzmów? XD – Mysticial

+0

Co jest nie tak z podpisem 'replace'? Ustaw 'a ~ Char' tak' [a] ~ String', a my mamy 'Eq Char', więc o co chodzi? – dave4420

+1

@ dave4420 Pierwszy problem polega na tym, że znajduje się w 'Network.CGI.Protocol' ... Całkiem przypadkowo jako import dla tego rodzaju funkcjonalności (którą możesz znaleźć w bardziej odpowiednich lokalizacjach) – Jedai

Odpowiedz

2

Nie, nie jest czymś magicFunction w standardowych bibliotekach. Ale łatwo jest napisać samemu, więc jeśli nie jest to często używana funkcja, nie ma sensu umieszczać go w bibliotece. W dodatku do swojej wersji i nutą Daniela Wagnera z tails i inits, oto prosta implementacja:

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

Nie ma nic takiego w standardowej dystrybucji. Jednakże, jest to znany trik, który może stanowić początek rozwiązanie:

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!","")] 
Powiązane problemy