F# - 如何从n-1元组和1创建n元组

时间:2014-08-04 21:48:53

标签: f# tuples

说我有一个元组:

let t = (1,'a')

我想创建一个三元组/三元组:

let createTriple (a,b) c =
    (a, b, c)

F#中有一个语法,我可以用n-1元组和一个奇异值创建一个n元组吗?

let createNTuple (a..z) q =
    (a..z, q)

3 个答案:

答案 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元素元组指定类型。如果需要可变长度结构,请使用列表。