如何在列表理解中使用条件?

时间:2017-10-25 17:59:54

标签: haskell if-statement list-comprehension

我正在尝试使用列表理解来构建0的列表。但我也想在列表中选择索引1。例如myList 5 2 = [0,1,0,0,0]其中5是元素数,2是索引。

myList el index = [0 | n <- [1..el], if n == index then 1 else 0]

但这会导致错误。

1 个答案:

答案 0 :(得分:4)

修复

的最小变化
myList el index = [if n == index then 1 else 0 | n <- [1..el]]

请注意,| left 的内容是生成列表元素的内容。对[ 0 | ...]形式的列表理解仅生成零,而...部分仅决定结果列表的长度。

此外,在您的代码中,编译器会抱怨,因为在| right ,我们只允许生成器(例如n <- someList),条件(例如x > 23)或新定义(let y = ...)。在您的代码中,if ...被解释为条件,为此它应该计算为布尔值,但then 1使结果成为数字,从而触发类型错误。

另一种解决方案可能是

myList el index = replicate (index-1) 0 ++ [1] ++ replicate (el-index) 0

其中replicate m 0生成一个m个零的列表,++连接。

最后,请注意您的index是基于1的。在许多编程语言中,这是非常规的,因为基于0的索引更常用。