说我有一个元组:
let t = (1,'a')
我想创建一个三元组/三元组:
let createTriple (a,b) c =
(a, b, c)
F#中有一个语法,我可以用n-1元组和一个奇异值创建一个n元组吗?
let createNTuple (a..z) q =
(a..z, q)
答案 0 :(得分:4)
你问的是在类型系统之外走路,所以确保你可以通过反射来实现,但不是以类型安全的方式。
let createNTuple tuple x =
let fields = [|yield! FSharpValue.GetTupleFields(tuple); yield box x|]
let fieldsTy = [|yield! FSharpType.GetTupleElements(tuple.GetType()); yield x.GetType()|]
let ty = FSharpType.MakeTupleType(fieldsTy)
FSharpValue.MakeTuple(fields, ty) |> unbox
let (a: int, b: char, c: string) = createNTuple (1, 'a') "foo"
答案 1 :(得分:2)
我建议定义一组函数(可能作为类中的静态成员,以便您可以使用重载),这将处理以类型安全的方式附加到元组。实际上,你最多只需要一个5或7元组,任何更多的感觉就像把它推得太远(尽管你仍然可以尝试通过反射来处理这些情况)。
这样的事情:
type TupleAppender =
static member Append((a, b), x) = (a, b, x)
static member Append((a, b, c), x) = (a, b, c, x)
(* and so on *)
这是样板文件,但至少你属于类型系统。
答案 2 :(得分:0)
不,你问的是不可能的。这种功能有什么类型的签名?与列表相反,元组可以具有不同类型的元素,但它们具有固定长度 - 正是因为您需要知道每个元素的类型。您无法为任何n元素元组指定类型。如果需要可变长度结构,请使用列表。