Я до сих пор не могу понять, зачем использовать ключевое слово inline
для функции.
Что это дает мне, чего у меня еще нет?
let inline (|Positive|Neutral|Negative|) x =
match sign x with
| 1 -> Positive
| -1 -> Negative
| _ -> Neutral
Я до сих пор не могу понять, зачем использовать ключевое слово inline
для функции.
Что это дает мне, чего у меня еще нет?
let inline (|Positive|Neutral|Negative|) x =
match sign x with
| 1 -> Positive
| -1 -> Negative
| _ -> Neutral
В этом случае может быть проще понять, что дает вам 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
inline
в F# - person Guy Coder   schedule 12.04.2016inline
для повышения производительности очевидно. Использованиеinline
для ввода текста не столь очевидно и даже известно людям, плохо знакомым с F#. Таким образом, когда я начал искать предыдущие вопросы SO, помеченныеinline
, я был удивлен тем, сколько из них содержат полезную информацию, но не имеют тегаinline
. Поэтому я благоразумно добавил тегinline
. Если вы теперь прочитаете результаты этого запроса, вы найдете много полезной информации, связанной сinline
. Если у вас есть открытый поиск вопросов и ответов для встроенного поиска, большая часть полезной информации содержится в ответах. - person Guy Coder   schedule 12.04.2016