В этом случае, возможно, будет легче понять, что inline
дает вам, если вы пытаетесь удалить ключевое слово:
let (|Positive|Neutral|Negative|) x =
match sign x with
| 1 -> Positive
| -1 -> Negative
| _ -> Neutral
Этот активный шаблон имеет тип float -> Choice<unit,unit,unit>
. Обратите внимание, что компилятор предположил, что он работает только для ввода float
.
Последствия этого могут быть наиболее очевидными, если мы также определяем функцию, которая использует этот шаблон, например. один, который определяет, является ли число является natural number:
let isNatural = function
| Positive -> true
| _ -> false
Эта функция имеет тип float -> bool
, что означает, что вы можете использовать его только с float
ввода:
> isNatural 1.;;
val it : bool = true
> isNatural 1;;
> isNatural 1;;
----------^
stdin(4,11): error FS0001: This expression was expected to have type
float
but here has type
int
Что делать, если вы хотите быть в состоянии чтобы определить, что и float
, int
, int64
и т. д. являются натуральными цифрами? Должны ли вы дублировать эти функции для всех типов ввода?
Вам не обязательно. Вы можете inline
функции:
let inline (|Positive|Neutral|Negative|) x =
match sign x with
| 1 -> Positive
| -1 -> Negative
| _ -> Neutral
let inline isNatural x =
match x with
| Positive -> true
| _ -> false
Из-за inline
ключевого слова, компилятор сохраняет тип функций родовое:
>
val inline (|Positive|Neutral|Negative|) :
x: ^a -> Choice<unit,unit,unit> when ^a : (member get_Sign : ^a -> int)
val inline isNatural : x: ^a -> bool when ^a : (member get_Sign : ^a -> int)
Это означает, что вы можете использовать любой типа для ввода, так как поскольку существует функция get_Sign
, которая принимает этот тип в качестве входных данных и возвращает int
.
Теперь вы можете вызывать функции с обеих float
, int
и других числовых типов:
> isNatural 1.;;
val it : bool = true
> isNatural 1;;
val it : bool = true
Ответ можно легко найти в документации https://msdn.microsoft.com/en-us/library /dd548047.aspx – Petr
Скорость для одного (иногда) –
http://stackoverflow.com/questions/10192390/make-function-work-with-all-numeric-types-int-float-long и http: // stackoverflow. com/questions/6285493/type-of-addition-in-fthere – s952163