我正在尝试从给定的列表列表中创建过滤的笛卡尔积。天真的解决方案如下:
import Data.Traversable (sequence)
predicate :: [T] -> Bool
predicate = ...
filteredCartesianProduct :: [[T]] -> [[T]]
filteredCartesianProduct = filter predicate . sequence
在没有创建中间列表的情况下,遍历是否足够强大?有没有惯用的方法呢?
答案 0 :(得分:1)
traverse
此处对predicate
格式为all foo
foo
的格式进行了编码。然后,filteredCartesianProduct
为traverse (filter foo)
。
如果predicate
对任何列表中的前缀表示肯定是肯定的,那么您已经获得了回溯模式:
filteredCartesianProduct = foldlM (\accum factor -> [new | x <- factor, let new = accum ++ [x], predicate new]) []
我想知道如何摆脱++ [_]
气味。