过滤列表笛卡尔积没有中间列表

时间:2017-01-29 16:07:35

标签: haskell traversable

我正在尝试从给定的列表列表中创建过滤的笛卡尔积。天真的解决方案如下:

import Data.Traversable (sequence)

predicate :: [T] -> Bool
predicate = ...

filteredCartesianProduct :: [[T]] -> [[T]]
filteredCartesianProduct = filter predicate . sequence

在没有创建中间列表的情况下,遍历是否足够强大?有没有惯用的方法呢?

1 个答案:

答案 0 :(得分:1)

traverse此处对predicate格式为all foo foo的格式进行了编码。然后,filteredCartesianProducttraverse (filter foo)

如果predicate对任何列表中的前缀表示肯定是肯定的,那么您已经获得了回溯模式:

filteredCartesianProduct = foldlM (\accum factor -> [new | x <- factor, let new = accum ++ [x], predicate new]) []

我想知道如何摆脱++ [_]气味。