Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 无中间列表的过滤列表笛卡尔积_Haskell_Traversable - Fatal编程技术网

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