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

¿Existe tal función mágica en el Preludio estándar o se puede componer fácilmente con otras funciones?Calculando todas las posibilidades de reemplazar un carácter por otro

Y no, esto no es tarea, pero aun así, por favor, no dedique demasiado tiempo a la tarea de rodar su propia solución complicada, preferiría hacerlo yo mismo que perder el tiempo;) Solo pregunta si está en el estandar.


EDIT: Aquí está mi primer intento:

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) 

se puede mejorar? Seguramente algo como replace debe estar en el estándar? Encontré replace :: Eq a => a -> a -> [a] -> [a] en Network.CGI.Protocol, pero tiene una firma incorrecta.

+0

¿Estás tratando de hacer una derivación del filtro malas palabras? XD – Mysticial

+0

¿Qué pasa con la firma de 'replace'? Establezca 'a ~ Char' para' [a] ~ String', y tenemos 'Eq Char', ¿cuál es el problema? – dave4420

+1

@ dave4420 El primer problema es que está en 'Network.CGI.Protocol' ... Bastante al azar como una importación para este tipo de funcionalidad (que puede encontrar en ubicaciones más apropiadas) – Jedai

Respuesta

2

No, no es algo así como magicFunction en las bibliotecas estándar. Pero es fácil escribir usted mismo, así que a menos que sea una función que se usa a menudo, no tiene sentido ponerlo en una biblioteca. Además de su versión y su pista de Daniel Wagner con tails y inits, he aquí una aplicación sencilla:

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

No hay nada como esto en la distribución estándar. Sin embargo, hay un truco bien conocido que podrían formar el inicio de una solución:

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!","")] 
Cuestiones relacionadas