【发布时间】:2017-01-29 16:07:35
【问题描述】:
我正在尝试从给定的列表列表中创建过滤的笛卡尔积。天真的解决方案如下:
import Data.Traversable (sequence)
predicate :: [T] -> Bool
predicate = ...
filteredCartesianProduct :: [[T]] -> [[T]]
filteredCartesianProduct = filter predicate . sequence
traversable 是否足够强大,可以在不创建中间列表的情况下完成它?有没有惯用的方法来做到这一点?
【问题讨论】:
-
假设您的
predicate函数的签名是正确的,那么您对filteredPowerSet的实现是不正确的。你为什么要用sequence组成filter predicate?这不进行类型检查。你的实现不应该是filteredPowerSet = filter predicate吗? -
声明的类型意味着您已经收到(或至少期待)一个幂集,而不是一个集,作为参数。
-
sequence不会创建 powerset。一方面,如果长度相等,它会生成一个列表列表。 -
sequence计算笛卡尔积 -- 也许这就是你的意思? -
filtered_sequence _ [] = [[]]; filtered_sequence (x:xs) = [z|u<-x, us<-sequence xs, let z = u:us, f z]。注意f不会传播,也就是说,要使这个定义递归,可以在理解内写filtered_sequence (const True) xs。
标签: haskell traversable