başka

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

tarafından bir karakter yerine tüm olanaklarını hesaplanması standart Prelude böyle bir sihirli işlevi var mı yoksa diğer işlevlerle kolayca oluşabilir?başka

Ve hayır, bu ev ödevi değildir, ama yine de, lütfen kendi karmaşık çözümünüzün el yordamıyla fazla zaman harcamayın, bunu kendim yerine harcamayı tercih ederim;) standart.


DÜZENLEME:

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) 

o geliştirilebilir Can: İşte benim ilk denemem? Kesinlikle replace gibi bir şey standart olmalı? Network.CGI.Protocol'da replace :: Eq a => a -> a -> [a] -> [a]'u buldum, ancak yanlış bir imzası var.

+0

: sürümüne ve tails ve inits Daniel Wagner'in ipucu ek olarak, burada basit bir uygulama var? XD – Mysticial

+0

'Değiştir'in imzası nesi var? 'A ~ Char' yani '[a] ~ String' 'i ayarlayın ve' Eq Char' var, sorun nedir? – dave4420

+1

@ dave4420 İlk sorun, 'Network.CGI.Protocol' içinde olmasıdır ... Bu tür bir işlevsellik için bir ithalat olarak oldukça rasgele (daha uygun konumlarda _can_ bulabilirsiniz) – Jedai

cevap

2

Hayır, standart kütüphanelerde magicFunction gibi bir şey söz konusu değildir. Ancak kendinizi yazmak çok kolaydır, bu yüzden sık kullanılan bir işlev olmadıkça, bir kitaplığa koymanın bir anlamı yoktur. Eğer bir küfür filtresi bypass yapmaya çalışıyorsunuz

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

Standart dağıtımda böyle bir şey yok. Ancak, çözümün başlangıç ​​oluşturabilir tanınmış numara var:

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