我有一个类型为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
答案 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#中的列表被约束为保存单个类型的值。您还将收到不完整模式匹配的警告,因为您的函数不适用具有奇数个值的列表。
如果不了解您尝试投放的问题的更多信息,我不确定这些问题的最佳解决方案是什么。