复制Haskell列表中的每个元素

时间:2010-12-15 10:12:56

标签: haskell

按功能划分 如何复制列表的每个元素两次。例如重复[1,3,5]应该返回[1,1,3,3,5,5]

并用列表中的其他元素替换元素。例如替换3 30 [1, 3 ,4 ,5, 3, 4]应返回[1, 30, 4, 5, 30, 4]

我是Haskell的新手,今天需要提交作业。

非常感谢任何帮助!

4 个答案:

答案 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 = mapconcat . 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'等。