Ответ 1
FSharpType.IsTuple
[MSDN] делает это.
let isTuple value =
match box value with
| null -> false
| _ -> FSharpType.IsTuple(value.GetType())
Я только начал изучать F #.
Интересно, как определить, является ли аргумент функции кортежем?
let tuple = (1, 2)
let notTuple = 3
let isTuple t = // returns 'true' if t is a tuple, 'false' otherwise
printfn "%b" isTuple tuple // true
printfn "%b" isTuple notTuple // false
FSharpType.IsTuple
[MSDN] делает это.
let isTuple value =
match box value with
| null -> false
| _ -> FSharpType.IsTuple(value.GetType())
Возможно, технически это способ сделать это, поскольку CLR поддерживает проверки типа времени выполнения. Но вы не должны этого делать. Это противоречит философии полиморфизма семьи ML - если вам нужна такая проверка, это указывает на то, что ваш алгоритм и/или структура структуры данных не очень хорошо подходят для языка программирования. (Исключение - если вам нужно взаимодействовать с существующими библиотеками .net, которые не следуют этой философии).
В частности, параметрический полиморфизм основан на понятии, что всякий раз, когда у вас есть что-то, что вы еще не знаете, какой он есть, это потому, что вы хотите обрабатывать все одинаково и не смотреть внутри данных, чтобы увидеть, что это такое, Несоблюдение этого правила сводится к работе с зерном языка программирования и сделает ваш код более сложным для понимания, поскольку типы не будут иметь обычной информации о том, как ваши функции обрабатывают данные.
Если вы хотите создать какой-либо код, который вы можете передать либо кортежем, либо одним номером, и чтобы этот код знал о различии, вы должны указать тип явного варианта, чтобы вы могли разделить возможности, используя сопоставление с образцом, и он будет явным в типах функций, которые они предоставляют вызывающему абоненту с таким выбором.