2013-04-07 40 views
1

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

replaceList :: (Eq a) => [a] -> ([a],[a]) -> [a] 
replaceList [email protected](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”)将返回“我是渡渡鸟”。但是,我正在寻找一种方法来使这个函数接受这些图簇的列表。例如:

replaceList“我是龙”[(“I”,“You”),(“am”,“are”),(“a dragon”,“awesome”)]“You are真棒”。

迄今我尝试过的方法是将部分应用的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

回答

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 
+0

由于常规。来自命令式语言的数据结构和迭代稍微简单一些,即使靠近,我也无法将我的头围绕在如何去做。我想我有点误解了作文,因为replaceInfinity(replaceList x y)是我试图用它做的。 – 2013-04-07 17:42:46

+1

@Dymatic我得到了组合语句这样工作:'replaceInfinity x [] = x; replaceInfinity x(y:ys)=翻转replaceInfinity ys。 replaceList x $ y' – 2013-04-07 17:52:50