使用递归和辅助函数的F#中两个列表的笛卡尔积

时间:2018-10-21 03:37:16

标签: f# product cartesian

我试图获取两个列表的笛卡尔乘积,但出现错误,提示未定义我的功能productHelp。我不太确定如何在没有助手功能的情况下解决该问题,甚至不确定是否可以调用我的助手功能来解决这个问题。

let rec product A B =
    match A, B with
    | [], [] -> [ [] ]
    | e1::rest1, [] -> productHelp A B :: product rest1 B

let rec productHelp A B =
    match A, B with
    | [], [] -> [ [] ]
    | _, [] -> [ [] ]
    | e1::rest1, e2::rest2 -> [e1::e2]::productHelp A rest2


/home/codio/workspace/program/set/set.fs(144,24): error FS0039: The value or constructor 'productHelp' is not defined. Maybe you want one of the followi
ng:   product [/home/codio/workspace/program/set/set.fsproj]
    5 Warning(s)
    1 Error(s)

示例:

// Example:
//   A = [1;2]
//   B = [3;4]
//   ==> [ [1;3]; [1;4]; [2;3]; [2;4] ]
// 

2 个答案:

答案 0 :(得分:3)

在F#中,必须在文件中对声明进行排序,以便声明仅引用文件上方的声明。也就是说,在product函数之前声明帮助程序。

答案 1 :(得分:0)

使用comprehension怎么样?

let product A B = [for a in A do for b in B -> [a; b]]