2010-12-15 59 views
2

通過函數 如何複製列表中的每個元素與自身兩次。例如重複[1,3,5]應該返回[1,1,3,3,5,5]複製Haskell列表中的每個元素

並用列表中的某個其他元素替換元素。例如取代3 30 [1, 3 ,4 ,5, 3, 4]應該返回[1, 30, 4, 5, 30, 4]

我是相當新的Haskell,今天需要提交作業。

任何幫助將不勝感激!

回答

9
duplicateEach = (>>= replicate 2) 
duplicateEach2 = concatMap (replicate 2) 
duplicateEach3 xs = [ y | x <- xs, y<-[x,x] ] 

import Data.List.Split 

replaceOne f t xs = [ y | x<-xs, let y = if x==f then t else x] 

replaceSublist f t = intercalate t . sepBy f -- f and t is lists 
+0

非常感謝你 – Nobre 2010-12-15 10:53:05

+21

來吧,不要爲他們做人的功課。 – luqui 2010-12-15 12:02:15

+10

@luqui我發現這有用幾年後 - 一個人的功課是另一個人的...不是功課? – sdasdadas 2013-11-17 02:19:49

9

映射元素並複製它們。然後concatinate結果:

concatMap (replicate 2) [1,3,5] 

對於第二個問題,看Data.List.Utils

replace [3] [30] [1,3,4,5,3,4] 
+0

非常感謝你,但我需要它們作爲函數 – Nobre 2010-12-15 10:34:24

+0

duplicatelist xs = concatMap(replicate)xs不適合我嗎? – Nobre 2010-12-15 10:34:42

+0

'duplicateList = concatMap(replicate 2)'適用於我。 ('duplicateList [1,2] == [1,1,2,2]') – adamse 2010-12-15 11:07:53

2

你能想到的每一個功能的步驟的順序:由功能

我該如何複製列表中的每個 元素與自身兩次。

要複製給出一個參數X列表XS,您需要申請一個函數,它的每一個元素,返回列表[XX],到的每一個元素列表;因爲這會產生一個列表清單,所以你需要連接結果。拼接列表是列表中每個元素重複:

k :: a -> [a] 
k x = [x,x] 

g :: (a -> b) -> [a] -> [b] 
g f [] = [] 
g f (x:xs) = f x : g f xs 

duplicate :: [a] -> [a] 
duplicate = concat . (g k) 

由於g = mapconcat . g = concatMap,你正在尋找的功能是:

duplicate :: [a] -> [a] 
duplicate = concatMap (\x -> [x,x]) 
      => concatMap (replicate 2) 

要由價值B取代的元素一個,使用交換b for a

f :: Eq a => a -> a -> a -> a 
f o r x = if x == o then r else x 

replaceOn :: Eq a => a -> a -> [a] -> [a] 
replaceOn o r [] = [] 
replaceOn o r (x:xs) = f o r x : h o r xs 

由於h = map f,您有:

replaceOn :: a -> a -> [a] -> [a] 
replaceOn o r = map (\x -> if x == o then r else x) 

我不是一個Haskell專家。但是,它幫助我將Haskell問題分解爲「返回值」序列。這些就像命令式語言中的「步驟」一樣。這些步驟由組合器,高階函數和函數排序組成。你可以考慮如下排序:做f得到x;到gf x得到x'

3

對於第一種:

duplicate_each xs = foldr dup [] xs 
    where dup x y = x : x : y 

至少對我來說,這是一個清晰的解決方案。

相關問題