为什么要对活动模式使用关键字 "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

如果你想确定floatintint64等都是自然数怎么办?您应该为所有输入类型复制这些函数吗?

你不必。您可以 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.

您现在可以使用 floatint 和其他数字类型调用函数:

> isNatural 1.;;
val it : bool = true
> isNatural 1;;
val it : bool = true