F#. Кортеж или нет
Я только начал изучать 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
2 ответа
FSharpType.IsTuple
[MSDN] делает это.
let isTuple value =
match box value with
| null -> false
| _ -> FSharpType.IsTuple(value.GetType())
Технически, возможно, существует способ сделать это, поскольку CLR поддерживает проверки типов во время выполнения. Но вы не должны этого делать. Это противоречит философии полиморфизма семейства ML - если вам нужна такая проверка, это указывает на то, что ваш алгоритм и / или структура структуры данных не очень подходят для языка программирования. (Исключение составляют случаи, когда вам нужно взаимодействовать с существующими библиотеками.net, которые не следуют этой философии).
Более конкретно, параметрический полиморфизм основан на концепции, чтовсякий раз, когда у вас есть что-то, что вы еще не знаете, какой это тип, это потому, что вы хотите обрабатывать все одинаково, а не заглядывать внутрь данных, чтобы увидеть, что это такое. Несоблюдение этого правила означает работу против структуры языка программирования и усложнит понимание вашего кода, поскольку типы не будут содержать обычной информации о том, как ваши функции обрабатывают данные.
Если вы хотите создать некоторый код, который вы можете передать как кортеж, так и одно число, и чтобы этот код учитывал разницу, вы должны определить явный тип варианта, чтобы вы могли отличить возможности, используя сопоставление с образцом, и это будет явным в типах функций, которые они предоставляют вызывающей стороне с таким выбором.