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

时间:2015-10-26 11:59:49

标签: recursion f# functional-programming tail-recursion

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

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

1 个答案:

答案 0 :(得分:4)

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

| 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#中的列表被约束为保存单个类型的值。您还将收到不完整模式匹配的警告,因为您的函数不适用具有奇数个值的列表。

如果不了解您尝试投放的问题的更多信息,我不确定这些问题的最佳解决方案是什么。