1

我正在寻找一种方法来替换 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 "Dragon" ("ragon","odo") 将返回 "I am a dodo"。但是,我正在寻找一种方法让这个函数接受这些元组的列表。例如:

replaceList "I am a dragon" [("I","You"),("am","are"),("a dragon","awesome")] 返回“你真棒”。

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

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

4

1 回答 1

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
于 2013-04-07T17:35:46.597 回答