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
答案 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
如果您希望能够确定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