Haskell 无中间列表的过滤列表笛卡尔积
我试图从给定的列表列表中创建一个经过过滤的笛卡尔积。简单的解决方案如下:Haskell 无中间列表的过滤列表笛卡尔积,haskell,traversable,Haskell,Traversable,我试图从给定的列表列表中创建一个经过过滤的笛卡尔积。简单的解决方案如下: import Data.Traversable (sequence) predicate :: [T] -> Bool predicate = ... filteredCartesianProduct :: [[T]] -> [[T]] filteredCartesianProduct = filter predicate . sequence traversable是否足够强大,可以在不创建中间列表的情
import Data.Traversable (sequence)
predicate :: [T] -> Bool
predicate = ...
filteredCartesianProduct :: [[T]] -> [[T]]
filteredCartesianProduct = filter predicate . sequence
traversable是否足够强大,可以在不创建中间列表的情况下执行此操作?有一种惯用的方法可以做到这一点吗?traverse在这里编码了一种模式,即对于某些foo,谓词的形式为all foo。然后,filteredCartesianProduct是traverse filter foo
如果谓词对其表示是的任何列表的每个前缀表示是,那么您就得到了回溯模式:
filteredCartesianProduct = foldlM (\accum factor -> [new | x <- factor, let new = accum ++ [x], predicate new]) []
我想知道如何消除+++[\u]味道。假设谓词函数的签名正确,那么filteredPowerSet的实现就不正确。为什么要用序列组成过滤器谓词?这不是打字检查。您的实现不应该是filteredPowerSet=filter谓词吗?声明的类型意味着您已经收到或至少需要一个功率集,而不是一个集,因为参数.sequence不会创建功率集。首先,如果equal length.sequence计算笛卡尔积,它会生成一个列表列表-也许这就是你的意思?filtered_sequence[]=[[]];过滤的|u序列x:xs=[z|u