为什么要对活动模式使用关键字 "inline"?
Why would I use the keyword "inline" for an Active Pattern?
我还是不明白为什么我要为函数使用关键字 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
输入。
如果我们还定义了一个使用此模式的函数,例如一个确定数字是否为 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
,并且returns int
.
您现在可以使用 float
、int
和其他数字类型调用函数:
> isNatural 1.;;
val it : bool = true
> isNatural 1;;
val it : bool = true
我还是不明白为什么我要为函数使用关键字 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
输入。
如果我们还定义了一个使用此模式的函数,例如一个确定数字是否为 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
,并且returns int
.
您现在可以使用 float
、int
和其他数字类型调用函数:
> isNatural 1.;;
val it : bool = true
> isNatural 1;;
val it : bool = true