替换Haskell中的字符串
我正在寻找一种方法来替换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只是一个函数,返回从某个索引开始
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