Зачем мне использовать ключевое слово inline для Active Pattern?

Я до сих пор не могу понять, зачем использовать ключевое слово inline для функции.

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

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

person Scott Nimrod    schedule 12.04.2016    source источник
comment
Ответ можно легко найти в документации msdn.microsoft.com/en-us/ библиотека/dd548047.aspx   -  person Petr    schedule 12.04.2016
comment
скорость на одного (иногда)   -  person John Palmer    schedule 12.04.2016
comment
Перегруженные функции (и операторы) должны быть помечены как встроенные в F#.   -  person Scott Nimrod    schedule 12.04.2016
comment
Представляет интерес: Inline Fun Part I Также ознакомьтесь с частями II, III и IV.   -  person Guy Coder    schedule 12.04.2016
comment
Представляет интерес: Использование inline в F#   -  person Guy Coder    schedule 12.04.2016
comment
Использование inline для повышения производительности очевидно. Использование inline для ввода текста не столь очевидно и даже известно людям, плохо знакомым с F#. Таким образом, когда я начал искать предыдущие вопросы SO, помеченные inline, я был удивлен тем, сколько из них содержат полезную информацию, но не имеют тега inline. Поэтому я благоразумно добавил тег inline. Если вы теперь прочитаете результаты этого запроса, вы найдете много полезной информации, связанной с inline. Если у вас есть открытый поиск вопросов и ответов для встроенного поиска, большая часть полезной информации содержится в ответах.   -  person Guy Coder    schedule 12.04.2016


Ответы (1)


В этом случае может быть проще понять, что дает вам inline, если вы попытаетесь удалить ключевое слово:

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

Этот активный шаблон имеет тип float -> Choice<unit,unit,unit>. Обратите внимание, что компилятор сделал вывод, что он работает только для ввода float.

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

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
person Mark Seemann    schedule 12.04.2016
comment
Спасибо Марк. Я интерпретировал документацию для встроенной только для производительности. Я все еще думаю, что это был важный вопрос, несмотря на то, что люди проголосовали против него. Еще раз спасибо. - person Scott Nimrod; 12.04.2016
comment
@ScottNimrod Я согласен с тем, что то, что вы искали, было действительным, но вопрос был специфичен для Active Patterns, и на него было легко ответить. Если бы вы задали вопрос по-другому, я думаю, вы добились бы желаемого результата. Мне потребовалось некоторое время, чтобы научиться задавать определенные типы вопросов, не наступая на мины. Например, кто-то недавно спросил вопрос о документации, и вопрос был закрыт, но я задавал похожие вопросы и получил положительные голоса. - person Guy Coder; 12.04.2016
comment
@ScottNimrod Я считаю, что если у меня есть вопрос, я делаю всю работу, которую могу, например. пишу код, исправляю ошибки, читаю документы, и только после того, как все это терпит неудачу, я пишу, что я сделал и где мне нужна помощь, и, прежде всего, убеждаюсь, что это объективный вопрос, затем я получаю хорошие быстрые ответы, обычно с плюсами . Да, я спросил о закрытии сайта и получил много любви (сарказм), но я полностью этого ожидал. - person Guy Coder; 12.04.2016
comment
@ScottNimrod Это не менталитет толпы, это дух. - person Guy Coder; 12.04.2016