Bạn không thể làm điều đó một cách dễ dàng, nhưng với một chút suy nghĩ nó có thể:
let isTuple tuple =
Microsoft.FSharp.Reflection.FSharpType.IsTuple(tuple.GetType())
let tupleValues (tuple : obj) =
Microsoft.FSharp.Reflection.FSharpValue.GetTupleFields tuple |> Array.toList
let rec flatten tupleFields =
tupleFields |> List.collect(fun value ->
match isTuple value with
| true -> flatten (tupleValues value)
| false -> [value]
)
let tupleToList (tuple : obj) =
if isTuple tuple
then Some (tupleValues tuple |> flatten)
else None
Vì vậy, ví dụ:
let s = tupleToList ((100,101,102,103),1,2,3,(4,5))
sẽ cung cấp cho bạn :
[100; 101; 102; 103; 1; 2; 3; 4; 5]
LƯU Ý: Câu trả lời này er được dựa trên mã được tìm thấy here.
Trong FParsec, bạn có thể sử dụng các hàm 'tuple3, tuple4, tuple5' hoặc' pipe3, pipe4, pipe5' để kết hợp nhiều trình phân tích cú pháp hơn, điều này có thể làm giảm nhu cầu của bạn về điều gì đó tương tự. – TheInnerLight
@TheInnerLight điểm tuyệt vời nhờ –