Haskell根据列表中的值的位置复制该值
我是哈斯克尔的新手。我正在尝试编写一个程序,它获取一个列表并返回一个列表,其中包含输入列表第一个元素的一个副本,然后是第二个元素的两个副本,第三个元素的三个副本,依此类推。e、 g.输入Haskell根据列表中的值的位置复制该值,haskell,Haskell,我是哈斯克尔的新手。我正在尝试编写一个程序,它获取一个列表并返回一个列表,其中包含输入列表第一个元素的一个副本,然后是第二个元素的两个副本,第三个元素的三个副本,依此类推。e、 g.输入[1,2,3,4],返回[1,2,2,3,3,4,4] import Data.List triangle :: [a] -> [a] triangle (x:xs) |x/=null = result ++ xs |otherwise = group(sort result)
[1,2,3,4]
,返回[1,2,2,3,3,4,4]
import Data.List
triangle :: [a] -> [a]
triangle (x:xs)
|x/=null = result ++ xs
|otherwise = group(sort result)
where result = [x]
我尝试使用++
将每个列表添加到一个新列表中,然后对其进行排序,但它不起作用。例如,我试图实现的是:列表是[1,2,3]
,result=[1,2,3]+[2,3]+[3]
,但已排序。给你:
三角形::[Int]->[Int]
三角形=concat。加油1
哪里
转到n[]=[]
go n(x:xs)=(复制nx):(go(n+1)xs)
这是一个简短的版本
三角形::[a]->[a]
三角形=concat。zipWith replicate[1..]
工作原理
zipWith
接受一个函数f:x->y->z
和两个列表[x1,x2,…]
[y1,y2,…]
并生成一个新列表[f x1 y1,f x2 y2,…]
。两个列表都可能是无限的-zipWith
将在其中一个列表的元素用完时停止(或者如果两个列表都是无限的,则永不停止)
replicate:Int->a->[a]
的工作原理如下:replicate nx
将生成一个包含n
-所有x
元素的列表,因此replicate 4'a'==“aaaa”
[1..=[1,2,3,4,…]
是一个从1
因此,如果您在zipWith replicate[1..][x1,x2,…]中使用replicate
,您将得到
[replicate 1 x1, replicate 2 x2, ..]
= [[x1], [x2,x2], ..]
因此,列表列表-最终concat
会将列表列表中的所有列表附加到我们想要的结果
最后一点:你可以根据()
的定义编写triangle xs=(concat.zipWith replaite[1..)xs
,而不是triangle xs=concat(zipWith replicate[1..)
,然后你可以将其简化为我给出的无点风格。更新:现在我明白你在这里的意思了。您想在尾部
上画对角线。好主意。:)以下是方法:
import Data.Universe.Helpers
import Data.List (tails)
bar :: [a] -> [a]
bar = concat . diagonals . tails
就这样
试一试:
> concat . diagonals . tails $ [1..3]
[1,2,2,3,3,3]
或者简单地说
> diagonal . tails $ [11..15]
[11,12,12,13,13,13,14,14,14,14,15,15,15,15,15]
(答案的前一版本:)
您听说过列表理解、数字枚举[1..]
和zip
功能吗
这是实现您的功能所需的全部:
foo :: [a] -> [a]
foo xs = [ x | (i,x) <- zip [1..] xs, j <- .... ]
foo::[a]->[a]
foo xs=[x |(i,x)看一看,一个好的开始是尝试zipWith(\i x->something_with_replicate…[1…]youList
在我看来,你似乎在尝试使用+
更新结果。Haskell不是这样工作的。变量都是不可变的,所以当你说result=[x]
,这意味着结果总是[x]
;这不会改变。你需要从功能上思考,计算你想要的结果,而不是试图改变任何东西。@d对我来说,这段代码是完全不可理解的。但我想我可以从这个例子中看出OP的意图,这实际上是一种很好的、几何的和抽象的。生成的代码非常简洁!(因为这个功能碰巧已经存在,在(不止一个)库中实现了)。而且它本身也不算什么——根本不算!:)(我的答案是这样的,以防你没有看到它)明白了,你能解释一下它为什么会起作用吗?我添加了一个解释-希望这有帮助,但说实话,你应该扮演好角色,玩一下。谢谢,我会用我自己的方式尝试。如果我们已经用直接风格写了,我们可以用++
替换:
,从而放弃concat
。