您好我想问是否有可能创建无限量无限列表的笛卡尔积。
序列是一个很好的功能,例如我想要的。但是我希望它可以在Infinites上工作。
我知道如何做两个无限列表的笛卡儿。
cartInf2 xs ys = xs >>= (\x ->
ys >>= (\y -> [[x,y]]))
此外,我无法弄清楚如何做任何数量的无限列表的笛卡尔
答案 0 :(得分:1)
首先,cartInf
实际上并不起作用。
ghci> take 100 $ cartInf2 [1..] [1..]
[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[1,11],[1,12],
[1,13],[1,14],[1,15],[1,16],[1,17],[1,18],[1,19],[1,20],[1,21],[1,22],[1,23],
[1,24],[1,25],[1,26],[1,27],[1,28],[1,29],[1,30],[1,31],[1,32],[1,33],[1,34],
...
我们永远不会达到第一个元素除了1
之外的任何一个点。正如@chi建议您可以使用Control.Monad.Omega
或Control.Monad.WeightedSearch
,如果您希望每一对最终都出现在结果中。
其次,无限多列表的笛卡尔积不可数(只要它们至少有两个元素),如proved by Cantor in 1891。假设我们有
allBoolLists :: [[Bool]]
allBoolLists = cartesianProduct (repeat [True,False])
这将是“所有无限的布尔列表”的列表。不存在这样的列表,因为我们可以构造
bad :: [Bool]
bad = zipWith negateNth [0..] allBoolLists
where
-- negates the nth element of a list
negateNth n xs = take n xs ++ not (xs !! n) ++ drop (n+1) xs
与allBoolLists
的每个元素不同 - 它与位置0的第0个元素,位置1的第1个元素不同,依此类推。