【发布时间】:2015-07-25 21:31:46
【问题描述】:
我在以下练习中遇到了问题:
利用列表推导,定义一个具有以下签名的函数:
reproduce :: [Int] -> [Int]
此函数将列表中的每个数字与自身的 x 个副本交换。
例如:
input: reproduce[3,5,1]
output: [3,3,3,5,5,5,5,5,1]
我做了以下事情:
reproduce :: [Int] -> [Int]
reproduce xs = [ x | x <- [1,2..10 ] , x `elem` xs , replicate x x ]
我的思路是让 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
我不知道如何修复此错误,我假设它与 elem 部分有关,但我不知道是什么。
注意:这是一个初学者练习,因此应该以简单的方式解决。
【问题讨论】:
-
不,正如它在错误中所说,它与
replicate x x有关,其中 Haskell 需要一个布尔值。 -
为什么 Haskell 期望一个布尔值?我应该尝试在
elem验证中添加 == True 吗? -
因为这是唯一一个结果是 Bool 的地方(我认为),因此可能因为我没有 == 比较,当它到达复制谓词时,它会给出错误?
-
复制不返回布尔值。这不是谓词。
标签: haskell replication list-comprehension