Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制Haskell列表中的每个元素_Haskell - Fatal编程技术网

复制Haskell列表中的每个元素

复制Haskell列表中的每个元素,haskell,Haskell,按功能 如何将列表中的每个元素复制两次。e、 g.重复的[1,3,5]应返回[1,1,3,3,5,5] 并用列表中的其他元素替换一个元素。e、 g.替换3 30[1,3,4,5,3,4]应返回[1,30,4,5,30,4] 我是哈斯克尔的新手,今天需要交作业 任何帮助都将不胜感激 映射元素并复制它们。然后连接结果: concatMap (replicate 2) [1,3,5] 关于第二个问题,请看 duplicateach=(>>=replicate 2) DuplicateAch2=con

按功能 如何将列表中的每个元素复制两次。e、 g.重复的
[1,3,5]
应返回
[1,1,3,3,5,5]

并用列表中的其他元素替换一个元素。e、 g.替换3 30
[1,3,4,5,3,4]
应返回
[1,30,4,5,30,4]

我是哈斯克尔的新手,今天需要交作业


任何帮助都将不胜感激

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

concatMap (replicate 2) [1,3,5]
关于第二个问题,请看

duplicateach=(>>=replicate 2)
DuplicateAch2=concatMap(复制2)

DuplicateAch3 xs=[y | x您可以将每个函数看作一系列步骤:

根据函数,如何复制每个 一个列表的元素,它自身有两次

要复制列表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)
要将元素a替换为值b,请使用将b交换为a的函数在列表上迭代:

由于
h=map f
,您有:

replaceOn :: a -> a -> [a] -> [a]
replaceOn o r = map (\x -> if x == o then r else x)
我不是Haskell专家。但是,它帮助我将Haskell问题分解为“返回值”序列。这些类似于“步骤”在命令式语言中。这些步骤是使用组合子、高阶函数和函数排序组成的。您可以考虑排序方式,如:dof得到x;tog用fx得到x',等等。

对于第一个步骤:

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

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

duplicatelist xs=concatMap(replicate)xs对我不起作用?
duplicatelist=concatMap(replicate 2)
对我起作用。(
duplicatelist[1,2]=[1,1,2,2]
)@Nobre:看来你甚至不能正确地复制和粘贴代码。我给了你需要知道的一切(可能比我应该给你的要多)。如果你自己不能用这些东西来做函数,那么你就不应该通过你正在学习的科目。老实说,我很惊讶这已经被否决了两次。没有nickela的答案那么多。也许你被否决是因为你说得太多。@luqui我发现这很有用几年后-一个人的家庭作业是另一个r个人的…不是家庭作业?嘿,我会为全班的某个人代课,以获得那些美味的互联网积分
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
replaceOn :: a -> a -> [a] -> [a]
replaceOn o r = map (\x -> if x == o then r else x)
duplicate_each xs = foldr dup [] xs
    where dup x y = x : x : y