Recursion 提取列表的两个元素并递归传递其余元素

Recursion 提取列表的两个元素并递归传递其余元素,recursion,f#,functional-programming,tail-recursion,Recursion,F#,Functional Programming,Tail Recursion,我有一个包含2种类型的类型def和一个相同类型的列表,该列表可能是空的,也可能不是空的 type Type1 = string type Type2 = int type Type3 = Sometype of Type1 * Type2 * Type3 list 我试图创建元组中所有前两个元素的列表,递归地传递最后一个其他类型3的列表,并将其附加到我正在生成的列表中。或者至少这是我正在尝试的。我的函数给了我一个错误: let rec extSometypeInc d = match

我有一个包含2种类型的类型def和一个相同类型的列表,该列表可能是空的,也可能不是空的

type Type1 = string
type Type2 = int
type Type3 = Sometype of Type1 * Type2 * Type3 list
我试图创建元组中所有前两个元素的列表,递归地传递最后一个其他类型3的列表,并将其附加到我正在生成的列表中。或者至少这是我正在尝试的。我的函数给了我一个错误:

let rec extSometypeInc d   =
   match d with
    | Sometype(n,i,[])         -> [(n,i)]
    | Sometype(n,i,r1::r2::rt) -> (n,i) :: extSometypeInc(r1,r2,rt)
    ;;
错误FS0001:此表达式应具有类型 类型3 但这里有一种类型 “a*”b*”c


我不能完全确定您在这里的最终目标,但就意外的结果类型而言,您似乎有语法错误

| Sometype(n,i,r1::r2::rt) -> (n,i) :: extSometypeInc(r1,r2,rt)
将三个值的一个元组作为其第一个参数传递给extSometypeInc

我相信你想要:

| Sometype(n,i,r1::r2::rt) -> (n,i) :: (extSometypeInc r1 r2 rt)
这将传递三个参数

然而,此时您会发现编译器将坚持Type1、Type2和Type3都是相同的类型,因为F中的列表被约束为保存单个类型的值。您还将收到模式匹配不完整的警告,因为您的函数不能容纳奇数个值的列表


在不了解您试图解决的问题的更多信息的情况下,我不确定这些问题的最佳解决方案是什么。

请提供一个关于您的问题的清晰、完整的示例-这里我们对Type1、Type2和extSometypeInc.一无所知。。。另外,您得到错误的那一行可能有助于澄清说明。查看您的澄清,我不确定Type3是否代表了您的期望。我可以建议你给出一些输入和输出的例子来帮助我们理解这个问题吗?