2013-04-07 60 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