无限多个无限列表的Haskell笛卡尔积

无限多个无限列表的Haskell笛卡尔积,haskell,Haskell,嗨,我想问一下,是否有可能创建无限多个无限列表的笛卡尔乘积 序列是我想要的一个很好的函数示例。但我希望它在无穷大上起作用 我知道如何做两个无限列表的笛卡尔变换 cartInf2 xs ys = xs >>= (\x -> ys >>= (\y -> [[x,y]])) 我也不知道如何做笛卡尔的无限列表首先,cartInf实际上不起作用 ghci> take 100 $ cartInf2 [1..] [1..] [[1,

嗨,我想问一下,是否有可能创建无限多个无限列表的笛卡尔乘积

序列是我想要的一个很好的函数示例。但我希望它在无穷大上起作用

我知道如何做两个无限列表的笛卡尔变换

cartInf2 xs ys = xs >>= (\x ->
                 ys >>= (\y -> [[x,y]]))

我也不知道如何做笛卡尔的无限列表首先,
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建议的那样,如果您希望最终在结果中显示每一对,您可以使用或

第二,无限多个列表的笛卡尔积是不可数的(只要它们至少有两个元素),正如。如果我们有

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个元素,依此类推。

您的
cartInf2
相当于
cartInf2'(x:xs)ys=map(\y->[x,y])ys
。有些配对从未列出。有无数的元素。可以保证某些元素不会被列出。考虑到这种数据结构是不可计算的,您打算如何使用它?也许你正试图用这个笛卡尔积解决的问题有一个不同的、更简单/更好的解决方案。你可能正在寻找,或者,如果你想在无限多的情况之间进行一种公平的交错。你能展示所需笛卡尔积的5-6个初始元素吗?假设所有输入列表都是
[1..]