【问题标题】:Extract two elements of list and pass the rest recursively提取列表的两个元素并递归传递其余元素
【发布时间】:2016-01-25 12:31:31
【问题描述】:

我有一个包含 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:此表达式应具有类型 Type3
但这里有类型 'a * 'b * 'c

【问题讨论】:

  • 请就您的问题提供一个清晰、完整的示例 - 在这里,我们对Type1、Type2 和extSometypeInc 一无所知...还有您可能会收到错误的行帮助

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


【解决方案1】:

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

| 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# 中的列表被限制为只能保存单一类型的值。您还将收到不完整模式匹配的警告,因为您的函数不包含奇数个值的列表。

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

【讨论】:

  • 编辑了清晰的描述。
  • 查看您的说明,我不确定 Type3 是否代表您的期望。我可以建议您提供一些示例输入和输出来帮助我们理解问题吗?
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多