2011-11-27 3 views
9

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

ответ

11

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

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

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

Смежные вопросы