F# 连接函数结果时出现问题

F# 连接函数结果时出现问题,f#,F#,我的教授让我们在F#中实现笛卡尔积。他提供了一种供我们使用的类型: type SET = | I of int list // I [1;2;3] | S of string list // S ["a";"b";"c"] | IS of (int * string) list // IS [(1, "a");(

我的教授让我们在F#中实现笛卡尔积。他提供了一种供我们使用的类型:

type SET =
   | I of int list                                  // I [1;2;3]
   | S of string list                               // S ["a";"b";"c"]
   | IS of (int * string) list                      // IS [(1, "a");(2, "b")]
   | II of (int * int) list                         // II [(1,2); (3,4); (5,6)]
   | SS of (string * string) list                   // SS [("a","b"); ("c","d")]
   | SI of (string * int) list                      // SI [("a", 1); ("b", 2); ("c", 3)]
   | SISI of ((string * int) * (string * int)) list // SISI [(("a", 1), ("b", 2)); (("c", 3), "d", 4))]
   | SIIS of ((string * int) * (int * string)) list // SIIS [(("a", 1), (2, "b")); (("c", 3), (4, "d"))]
在此过程中,我们还获得了“产品”功能,其行为如下:

let product s1 s2 =
  match (s1, s2) with
    | (I s1, I s2) -> II (pairs s1 s2)
    | (S s1, S s2) -> SS (pairs s1 s2)
    | (I s1, S s2) -> IS (pairs s1 s2)
    | (S s1, I s2) -> SI (pairs s1 s2)
    | (SI s1, IS s2) -> SIIS (pairs s1 s2)
    | (SI s1, SI s2) -> SISI (pairs s1 s2)
赋值是创建一个函数“pairs”,它组装集合元素的笛卡尔积。我们被告知从创建一个函数开始,该函数可以在列表中分配值。我在这里这样做:

let rec dist a L =
    match L with
    | [] -> []
    | h::t -> (a,h) :: dist a t
到目前为止,我的函数如下所示:

let rec pairs s1 s2 = 
    match s1 with
    | [] -> []
    | h::t -> dist h s2 // AND (pairs t s2)

我不明白我需要如何修改match语句的最后一行,以正确反映我们想要的输出。这将成功完成部分功能,但仅完成第一位(与列表头被分发的事实相关,而不是尾部)。如何将此函数在s1头上的第一个循环的结果连接到“pairs t s2”,以便在第一个段中创建的元素与第二个段匹配,从而防止预期类型发生冲突?

对不起,这是一个非常愚蠢的问题。如果任何人都能帮助解决类似情况,则可通过将最后一行写为:

let rec pairs s1 s2 = 
    match s1 with
    | [] -> []
    | h::t -> (dist h s2) @ (pairs t s2)

我以前尝试过所有与::运算符的连接,但是这是此操作的错误运算符类型。

编译器不会发出警告吗,因为不是所有情况都包含在乘积函数中?我看到他遗漏了ISIS:-)编译器会发出警告,但我的教授只是根据一组有限的测试用例的反应来评分。在我的例子中,这样就可以了,但它在技术上很糟糕,可能会收到一个无法解决的案例。