复制Haskell列表中的每个元素

问题描述 投票:2回答:4

by functions如何复制列表的每个元素两次。例如重复[1,3,5]应该返回[1,1,3,3,5,5]

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

我在Haskell很新,需要今天提交作业。

任何帮助将不胜感激 !

haskell
4个回答
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

11
投票

映射元素并复制它们。然后连接结果:

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

关于第二个问题,请看Data.List.Utils

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

3
投票

对于第一个:

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

至少对我来说,这是一个更清晰的解决方案。


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,用一个函数迭代列表,该函数用于交换b:

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得到x'等等

© www.soinside.com 2019 - 2024. All rights reserved.