在Haskell中替换字符串

时间:2013-04-07 16:56:24

标签: haskell replace

我正在寻找一种方法来替换Haskell中出现的字符串。我有这个单对工作。我当前的功能是这样实现的:

replaceList :: (Eq a) => [a] -> ([a],[a]) -> [a]
replaceList z@(x:xs) (a,b)
| take (length a) z == a = b ++ strt z (length a)
| otherwise = x : replaceList xs (a,b)

在此上下文中,strt只是一个返回从某个索引开始的列表的函数。这个功能有效。 replaceList“龙”(“ragon”,“odo”)将返回“我是渡渡鸟”。但是,我正在寻找一种方法来使这个函数接受这些tupples的列表。例如:

replaceList“我是龙”[(“我”,“你”),(“我”,“是”),(“龙”,“太棒了”)]返回“你很棒”。< / p>

到目前为止,我尝试过的方法是将一个部分应用的replaceList映射到一个tupples列表,但是返回一个已更改的每个元素的列表。我也尝试过使用这段代码:

replaceInfinity :: (Eq a) => [a] -> [([a],[a])] -> [a]
replaceInfinity x [] = x
replaceInfinity x ((a,b):ys) = (flip replaceList (a,b)) . (replaceInfinity x ys) 

但无法编译。我对Haskell相对较新,并且正在使用它来重写旧的语言预处理器。我无法理解如何实现这种功能的逻辑。

有人可以告诉我找到答案的策略,或者甚至为我实现这个功能,这样我就能学会如何做到这一点?如果它有帮助,我有完整的源文件,我一直在这里使用它:http://hpaste.org/85363

1 个答案:

答案 0 :(得分:1)

我能想到的对代码的最小变化是:

replaceInfinity :: Eq a => [a] -> [([a], [a])] -> [a]
replaceInfinity x []     = x
replaceInfinity x (y:ys) = replaceInfinity (replaceList x y) ys

OUTPUT:
*Main> replaceInfinity "I am a dragon" [("I","You"),("am","are"),("a dragon","awesome")]
"You are awesome"


第二个想法:

replaceInfinity x ((a,b):ys) = (flip replaceInfinity ys) . (replaceList x) $ (a,b)

或者更简洁:

replaceInfinity x (y:ys) = flip replaceInfinity ys . replaceList x $ y