Sml 在标准ML中生成笛卡尔幂

Sml 在标准ML中生成笛卡尔幂,sml,smlnj,ml,Sml,Smlnj,Ml,常见的笛卡尔积可以实现为: fun cartesian(xs, ys) = let fun pairOne(x,[]) = [] | pairOne(x, y::ys) = [x,y]::pairOne(x,ys) fun cart([],ys) = [] | cart(x::xs, ys) = pairOne(x, ys) @ cart(xs,ys) in cart(xs,ys) end 我在寻找一种产生k级笛卡尔幂的方法 对

常见的笛卡尔积可以实现为:

fun cartesian(xs, ys) =
   let fun pairOne(x,[]) = []
     | pairOne(x, y::ys) = [x,y]::pairOne(x,ys)
       fun cart([],ys) = []
     | cart(x::xs, ys) = pairOne(x, ys) @ cart(xs,ys)
   in
       cart(xs,ys)
   end
我在寻找一种产生k级笛卡尔幂的方法

对于k=2,这将输出:

[[true,true],[true,false],[false,true],[false,false]]
对于k=3:

[[true,true,true],[true,true,false],[true,false,false],[false,false,false],[false,false,true],...]

谢谢

以下方法似乎有效:

fun product [] _ = []
|   product (x::xs) products = (map (fn p => x::p) products) @ product xs products

fun power _ 0 = []
|   power xs 1 = map (fn x => [x]) xs
|   power xs n = product xs (power xs (n-1))
第一个函数形成一个列表和另一个列表的笛卡尔乘积,该列表本身就是一个列表列表。比如说,

- product [1,2] [[3],[4]];
val it = [[1,3],[1,4],[2,3],[2,4]] : int list list
- power [true,false] 2;
val it = [[true,true],[true,false],[false,true],[false,false]] : bool list list
它的主要用途是作为辅助函数,为现有笛卡尔积添加另一个因子。函数
power
首先获取列表,并在基本情况n=1下将其转换为具有1个因子的“power”,然后使用递归a^n=a x a^(n-1)建立幂

比如说,

- product [1,2] [[3],[4]];
val it = [[1,3],[1,4],[2,3],[2,4]] : int list list
- power [true,false] 2;
val it = [[true,true],[true,false],[false,true],[false,false]] : bool list list

你似乎根本没有问过排列。更像是在问列表本身的笛卡尔幂。@JohnColeman谢谢,你说得对。我修改了我的问题。