我决定学习 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 ᵗʰ 项在 pair 位置,则追加到输出True
i次 to 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方式实现我正在寻找的结果?