替换Haskell中的字符串

替换Haskell中的字符串,haskell,replace,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只是一个函数,返回从某个索引开始

我正在寻找一种方法来替换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只是一个函数,返回从某个索引开始的列表。这个功能有效。替换名单“龙”(“拉贡”,“奥多”)将返回“我是渡渡鸟”。然而,我正在寻找一种方法使这个函数接受这些元组的列表。例如:

替换列表“我是一条龙”[(“我”、“你”)、(“我”、“是”)、(“一条龙”、“棒极了”)]返回“你棒极了”

到目前为止,我尝试的方法是将一个部分应用的替换列表映射到一个元组列表上,但这会返回一个更改的每个单独元素的列表。我还尝试使用以下代码:

replaceInfinity :: (Eq a) => [a] -> [([a],[a])] -> [a]
replaceInfinity x [] = x
replaceInfinity x ((a,b):ys) = (flip replaceList (a,b)) . (replaceInfinity x ys) 
但这无法编译。我对Haskell比较陌生,正在使用它重写一个旧的语言预处理器。我无法理解如何实现这种功能的逻辑


有人能告诉我获得答案的策略吗,或者甚至可以为我实现这个功能,这样我就可以了解如何实现它了?如果有帮助的话,我这里有我一直在使用的完整源文件:

我能想到的对代码的最小更改是:

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

我能想到的对代码的最小更改是:

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

谢谢,太棒了。来自命令式语言,数据结构和迭代比较简单,我就是不知道该怎么做,尽管我已经接近了。我想我有点误解了构图,因为replaceInfinity(replaceList x y)ys是我试图用它来做的。@Dymatic我用这种方式得到构图语句:
replaceInfinity x[]=x;replaceInfinity x(y:ys)=翻转replaceInfinity。replaceList x$y
谢谢groovy。来自命令式语言,数据结构和迭代比较简单,我就是不知道该怎么做,尽管我已经接近了。我想我有点误解了构图,因为replaceInfinity(replaceList x y)ys是我试图用它来做的。@Dymatic我用这种方式得到构图语句:
replaceInfinity x[]=x;replaceInfinity x(y:ys)=翻转replaceInfinity。替换列表x$y