Haskell根据列表中的值的位置复制该值

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)

我是哈斯克尔的新手。我正在尝试编写一个程序,它获取一个列表并返回一个列表,其中包含输入列表第一个元素的一个副本,然后是第二个元素的两个副本,第三个元素的三个副本,依此类推。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)
    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