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

Esiste una tale funzione magica nel Preludio standard o può essere composta facilmente con altre funzioni?Calcolo di tutte le possibilità di sostituire un carattere con un altro

E no, questo non è compito a casa, ma ancora, per favore non passare troppo tempo a girare la tua soluzione complicata, preferirei farlo io stesso che sprecare il tuo tempo;) Solo chiedendo se è in lo standard.


EDIT: Ecco il mio primo tentativo:

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) 

può essere migliorato? Sicuramente qualcosa come replace deve essere nello standard? Ho trovato replace :: Eq a => a -> a -> [a] -> [a] in Network.CGI.Protocol, ma ha la firma sbagliata.

+0

Stai cercando di fare un bypass filtro di blasfemo? XD – Mysticial

+0

Cosa c'è di sbagliato nella firma di 'replace'? Imposta 'a ~ Char' quindi' [a] ~ String', e abbiamo 'Eq Char', quindi qual è il problema? – dave4420

+1

@ dave4420 Il primo problema è che si trova in 'Network.CGI.Protocol' ... Abbastanza casuale come importazione per questo tipo di funzionalità (che si può trovare in posizioni più appropriate) – Jedai

risposta

2

No, non è qualcosa di simile magicFunction nelle librerie standard. Ma è facile scrivere te stesso, quindi a meno che non sia una funzione usata spesso, non ha senso metterlo in una biblioteca. Oltre alla versione e il suggerimento di Daniel Wagner con tails e inits, ecco una semplice implementazione:

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

Non c'è niente di simile nella distribuzione standard. Tuttavia, c'è un trucco ben noto che potrebbero costituire l'inizio di una soluzione:

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!","")] 
Problemi correlati