任意类型的任意多个列表的笛卡尔积(在Haskell中)

问题描述 投票:2回答:2

已经提出并回答了几个类似的问题。可以找到实例,例如:

  1. Cartesian product of 2 lists in Haskell
  2. Cartesian product over a list of lists in Haskell
  3. How can I compute a Cartesian product iteratively?

但是,我所发现的东西都没有完全回答我的问题。

问题

在Haskell中,是否可能以及如何定义一个函数cartesianProduct,它接受任意(有限)个列表不同类型并在鼻子上输出其笛卡尔积?

背景

例如,在上面的链接中可以找到一个cartesianProd_2,它优雅地吸收了两个不同类型的列表:

cartesianProd_2 :: [a] -> [b] -> [(a,b)]
cartesianProd_2 list_A list_B = [(x,y) | x<-list_A, y<-list_B]

对于某些固定的整数n,可以很容易地将其推广为cartesianProd_n。>

但是,我希望可以定义一个可以做到的

cartesianProd (list_1,list_2) == (cartesianProd_2 list_1 list_2)
cartesianProd (list_1,list_2,list_3) == (cartesianProd_3 list_1 list_2 list_3)

-- and so on .. notice that list_i is a list of elements of type i.

我遇到的一个[[直接障碍]

我什至不知道cartesianProdtype是什么!它的域是(不同类型的列表)的元组!那我该怎么办?非常感谢。编辑

如果在Haskell中不可能,请提供(指向a的)证明。

已经提出并回答了几个类似的问题。例如,可以找到实例:Haskell中2个列表的笛卡尔积在Haskell中列表列表上的笛卡尔积我如何...

haskell types infinite cartesian-product
2个回答
2
投票
不能这样做,确切的原因是您要结束的:不同大小的元组是不相关的类型,您不能对其进行概括。由于相同的原因,Haskell没有通用的zipWithN可将N个不同类型的列表压缩在一起。您必须接受[[a]]作为输入(要求所有输入为同一类型),或者专门处理特定的元组大小(cart2cart3cart4等)。

0
投票

如果您好奇如何操作类型级数据结构来解决上述问题,请继续阅读。如果您要解决实际问题,请跳过所有这些废话,然后跳至In Reality

© www.soinside.com 2019 - 2024. All rights reserved.