2013-02-14 1 views
3

Я хотел бы заменить подстроку строкой в ​​Haskell, не используя внешние библиотеки, и, если возможно, с хорошей производительностью.Как заменить подстроку строки на другую в Haskell без использования внешних библиотек, таких как MissingH?

Я думал об использовании функций замены Data.Text, но я не хочу переносить всю мою программу, чтобы использовать тип Text вместо Strings. Упаковал бы String в значение Text, а затем заменил бы то, что хотел, а затем распаковал, чтобы значение текста до String было медленным на множестве Strings?

+11

Для многих интерпретаций «хорошего исполнения» вы * должны * заменить 'String' на' Text'. – gspr

+4

Портировать всю вашу программу, чтобы использовать 'Text' вместо' String', вряд ли будет сложно, просто утомительно. Существуют угловые случаи, касающиеся API-интерфейсов, использующих 'String' без возможности использовать' Text'/'ByteString', но по большей части это просто вопрос изменения типа в одном месте, а затем исправление ошибок типа, возникающих в другом месте , – dave4420

ответ

7

Попробуйте это (непроверенные):

replace :: Eq a => [a] -> [a] -> [a] -> [a] 
replace needle replacement haystack 
    = case begins haystack needle of 
     Just remains -> replacement ++ remains 
     Nothing  -> case haystack of 
         []  -> [] 
         x : xs -> x : replace needle replacement xs 

begins :: Eq a => [a] -> [a] -> Maybe [a] 
begins haystack []    = Just haystack 
begins (x : xs) (y : ys) | x == y = begins xs ys 
begins _  _     = Nothing 

Но в целом вы получите прирост производительности от перехода вашей программы использовать Text с вместо String с.

+0

ok, im gonna port моя программа к типу текста, но как бы я прочитал файл как текст вместо строки? для этого нет функции, например, при использовании байтов. просто перевести строку в текстовый? – tolUene

+7

@ nils8950 Для этого нет функций? [Вы уверены] (http://www.haskell.org/hoogle/?hoogle=FilePath+-%3E+IO+Text)? –

+0

@ ThomasM.DuBuisson спасибо !! Я почему-то не нашел это. – tolUene

Смежные вопросы