通過函數 如何複製列表中的每個元素與自身兩次。例如重複[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,今天需要提交作業。
任何幫助將不勝感激!
通過函數 如何複製列表中的每個元素與自身兩次。例如重複[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,今天需要提交作業。
任何幫助將不勝感激!
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
映射元素並複製它們。然後concatinate結果:
concatMap (replicate 2) [1,3,5]
對於第二個問題,看Data.List.Utils
replace [3] [30] [1,3,4,5,3,4]
你能想到的每一個功能的步驟的順序:由功能
我該如何複製列表中的每個 元素與自身兩次。
要複製給出一個參數X列表XS,您需要申請一個函數,它的每一個元素,返回列表[X,X],到的每一個元素列表;因爲這會產生一個列表清單,所以你需要連接結果。拼接列表是列表中每個元素重複:
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 = map
和concat . 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;到g與f x得到x'等
對於第一種:
duplicate_each xs = foldr dup [] xs
where dup x y = x : x : y
至少對我來說,這是一個清晰的解決方案。
非常感謝你 – Nobre 2010-12-15 10:53:05
來吧,不要爲他們做人的功課。 – luqui 2010-12-15 12:02:15
@luqui我發現這有用幾年後 - 一個人的功課是另一個人的...不是功課? – sdasdadas 2013-11-17 02:19:49