复制Haskell列表中的每个元素
按功能 如何将列表中的每个元素复制两次。e、 g.重复的复制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
[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