Why would I use the keyword "inline" for an Active Pattern?

时间:2016-04-12 00:52:11

标签: f# inline active-pattern

I still cannot understand why I would use the keyword inline for a function.

What does it give me that I don't already have?

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

1 个答案:

答案 0 :(得分: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

如果您希望能够确定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,并返回int

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

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