在标准ML中生成笛卡尔幂

时间:2015-10-08 09:27:15

标签: 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级笛卡尔力的方法。

对于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],...]

由于

1 个答案:

答案 0 :(得分:2)

以下似乎有效:

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首先获取列表并将其转换为" power"在基础情况下n = 1时使用1因子,然后使用递归A ^ n = A x A ^(n-1)建立功率。

例如,

- power [true,false] 2;
val it = [[true,true],[true,false],[false,true],[false,false]] : bool list list