【发布时间】:2013-05-31 21:00:46
【问题描述】:
我决定学习 Haskell 并学习以更实用的方式思考,所以我尝试解决非常简单的练习,尝试在这个范例中使用一种好的方法。
我正在尝试在 Haskell 中完成这个简单的练习:
Input: [2, 4, 1, 1, 2]
Output: [True, True, False, False, False, False, True, False, True, True]
因此,Input 列表中的元素将落入False
Output 列表,奇数元素为True;每一个人
重复次数与Input 列表中的值相同。
遍历Input列表,如果i ᵗʰ项是成对的
位置,追加到输出True i 次到Output;如果
i ᵗʰ 项目在奇数位置,追加False i 次
到Output 列表。
这似乎是一个非常简单的问题,确实如此。但对我来说,没有任何 函数式编程背景,不知道怎么表达 在 Haskell 中。
我尝试使用 λ 函数来跟踪当前索引 在列表理解中。
row :: [Integer] -> [Bool]
row xs = [ (last $ zipWith (\i x -> x) [1..] [0..i]) `mod` 2 == 0
| j <- xs, i <- [0..j-1] ]
但我不了解它的行为,所以我结束了使用findIndices
作为一个快速的替代方案:
row :: [Integer] -> [Bool]
row xs = [ (head $ findIndices (==j) (xs)) `mod` 2 == 0
| j <- xs, i <- [0..j-1] ]
使用最后一种方法似乎没问题:
> let xs = [ 1, 4, 3, 2 ]
> print $ row xs
[True,False,False,False,False,True,True,True,False,False]
但问题并没有解决,因为项目不一定是唯一的:
> let xs = [ 2, 2, 4, 3]
> print $ row xs
[True,True,True,True,True,True,True,True,False,False,False]
因为head findIndices 只给出了第一次出现的情况。
(虽然我认为,如果有效,那不是一种非常有效的方法
解决这个问题。)
我怎样才能以 Haskellian 的方式实现我正在寻找的结果?
【问题讨论】:
-
我认为您的示例输出应该更改。你错过了 4 个错误。
-
你没有附加真/假 i 次,对吧?您将其附加列表 [i] 次。
标签: list haskell functional-programming list-comprehension