F #. Кортеж или нет - PullRequest
       23

F #. Кортеж или нет

9 голосов
/ 27 ноября 2011

Я только начал изучать 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 ]

15 голосов
/ 27 ноября 2011

FSharpType.IsTuple [MSDN] делает это.

let isTuple value = 
  match box value with
  | null -> false
  | _ -> FSharpType.IsTuple(value.GetType())
11 голосов
/ 27 ноября 2011

Технически, возможно, существует способ сделать это, поскольку CLR поддерживает проверки типов во время выполнения.Но вы не должны хотеть сделать это.Это противоречит философии полиморфизма семейства ML - если вам нужна такая проверка, это указывает на то, что ваш алгоритм и / или структура структуры данных не очень подходят для языка программирования.(Исключение составляют случаи, когда вам нужно взаимодействовать с существующими библиотеками .net, которые не следуют этой философии.)Вы уже не знаете, какой это тип , потому что вы хотите обрабатывать все одинаково, а не заглядывать в данные, чтобы увидеть, что это такое.Несоблюдение этого правила означает работу против структуры языка программирования и усложнит понимание вашего кода, поскольку типы не будут содержать обычной информации о том, как ваши функции обрабатывают данные.

Если вы хотитесоздайте некоторый код, который вы можете передать как кортеж, так и одно число, и чтобы этот код учитывал разницу, вы должны определить явный тип варианта так, чтобы вы могли отличить возможности, используя сопоставление с образцом,и это будет явно указано в типах функций, которые они предоставляют вызывающей стороне с таким выбором.

...