Haskell concat在列表理解中复制

eXi*_*nCe 2 replication haskell list-comprehension

我在进行以下练习时遇到问题:

利用列表理解,定义具有以下签名的函数:

reproduce :: [Int] -> [Int]
Run Code Online (Sandbox Code Playgroud)

此函数通过x副本自身交换列表中的每个数字.

例如:

input: reproduce[3,5,1]
output: [3,3,3,5,5,5,5,5,1]
Run Code Online (Sandbox Code Playgroud)

我做了以下事情:

reproduce :: [Int] -> [Int]
reproduce xs = [ x | x <- [1,2..10 ] , x `elem` xs , replicate x x ]
Run Code Online (Sandbox Code Playgroud)

我的想法是让x属于一个小间隔,x必须是原始列表的一个元素,所以使用elemx只会在它确实属于原始列表时添加,并复制x,x次,以获得x自己的副本.

当我尝试加载此功能时,我收到以下错误消息:

Couldn't match expected type `Bool' with actual type `[Int]'
In the return type of a call of `replicate'
In the expression: replicate x x
In a stmt of a list comprehension: replicate x x
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决这个错误,我假设它与elem部件有关但我不知道是什么.

注意:这是初学者练习,因此应该以简单的方式解决.

mel*_*ene 6

列表解析由结果表达L和一种或多种以逗号分隔的右手形式R1,R2布置这样的,...:

[ L | R1, R2, ... ]
Run Code Online (Sandbox Code Playgroud)

每个右侧的形式必须是(1)发电机:

pattern <- expression
Run Code Online (Sandbox Code Playgroud)

或(2)let具约束力:

let pattern = expression
Run Code Online (Sandbox Code Playgroud)

或(3)过滤条件(返回a的表达式Bool):

expression
Run Code Online (Sandbox Code Playgroud)

在您的代码中,我们有三个这样的表单.x <- [1,2..10 ]是一个生成器(案例2),x `elem` xs是一个过滤条件(案例3),但不replicate x x适合这些.这就是错误消息的含义:Haskell期望表达式具有类型Boolreplicate返回列表.


要真正解决问题,您可以从这样做:

notQuiteReproduce xs = [ replicate x x | x <- xs ]
Run Code Online (Sandbox Code Playgroud)

现在notQuiteReproduce [3, 5, 1]收益率[[3,3,3],[5,5,5,5,5],[1]].剩下的就是"压扁"结果列表.这也可以通过列表理解来完成,但我不愿意让解决方案消失.