2016-04-12 2 views
2

Я все еще не понимаю, почему я использовал бы ключевое слово inline для функции.Зачем использовать ключевое слово "inline" для активного шаблона?

Что это дает мне, что у меня их еще нет?

let inline (|Positive|Neutral|Negative|) x = 
match sign x with 
| 1 -> Positive 
| -1 -> Negative 
| _ -> Neutral 
+5

Ответ можно легко найти в документации https://msdn.microsoft.com/en-us/library /dd548047.aspx – Petr

+1

Скорость для одного (иногда) –

+1

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

ответ

10

В этом случае, возможно, будет легче понять, что 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 
+1

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

+1

@ScottNimrod Я согласен с тем, что то, что вы искали, было действительным, но вопрос был специфичен для активных шаблонов, и на это легко ответил. Если бы вы задали вопрос по-другому, я думаю, вы бы достигли желаемого результата. Мне потребовалось некоторое время, чтобы лучше задавать определенные вопросы, не наступая на мины. Например, кто-то недавно спросил [вопрос] (http://stackoverflow.com/questions/36538273/is-there-any-documentation-on-how-to-use-glimpse-with-f-and-suave) о документации и вопрос был закрыт, но я задал подобные вопросы и получил голосов. –

+0

Люди по сути проявляют массовость менталитета, особенно на SO. –

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