按功能划分
如何复制列表的每个元素两次。例如重复[1,3,5]
应该返回[1,1,3,3,5,5]
?
并用列表中的其他元素替换元素。例如替换3 30 [1, 3 ,4 ,5, 3, 4]
应返回[1, 30, 4, 5, 30, 4]
我是Haskell的新手,今天需要提交作业。
非常感谢任何帮助!
答案 0 :(得分:11)
映射元素并复制它们。然后连接结果:
concatMap (replicate 2) [1,3,5]
关于第二个问题,请查看Data.List.Utils
replace [3] [30] [1,3,4,5,3,4]
答案 1 :(得分:8)
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
答案 2 :(得分:3)
第一个:
duplicate_each xs = foldr dup [] xs
where dup x y = x : x : y
至少对我而言,这是一个更清晰的解决方案。
答案 3 :(得分:2)
您可以将每个功能视为一系列步骤:
by functions如何复制每一个 列表的元素本身两次。
要复制列表 xs 的每个元素,您需要应用一个函数,给定参数 x ,返回列表[ 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 替换元素 a ,请使用为 a <交换 b 的函数遍历列表/ EM>:
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 ;使用 f x 来 g 以获取 x'等。