F# 为什么我要使用关键字“quot;内联“;对于活动模式?
我仍然无法理解为什么我会对函数使用关键字F# 为什么我要使用关键字“quot;内联“;对于活动模式?,f#,inline,active-pattern,F#,Inline,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
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
。请注意,编译器推断它只适用于float
输入
如果我们还定义了一个使用此模式的函数,例如确定数字是否为:
此函数的类型为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)
答案可以很容易地在一个(有时)和感兴趣的文档速度中找到:也可以查看第二部分、第三部分和第四部分。感兴趣的:谢谢mark。我将内联文档解释为仅用于性能。我仍然认为这是一个重要的问题,不管人们投票反对。再次感谢。@ScottNimrod我同意你所寻求的是有效的,但这个问题是针对活动模式的,很容易回答。如果你问的问题不同,我想你会达到预期的结果。我花了一段时间才在不踩地雷的情况下更好地提出某些类型的问题。例如,最近有人问了一个关于文档的问题,这个问题已经解决了,但我问了类似的问题并获得了投票。@ScottNimrod我发现如果我有问题要问,我会做我能做的所有工作,例如写代码、修复bug、阅读文档,然后直到所有这些都失败之后,我写下我所做的事情和我需要帮助的地方,最重要的是确保这是一个客观的问题,然后我会得到很好的快速答案,通常是投票。是的,我问过网站被关闭的事,并得到了很多的爱(讽刺),但我完全预料到了。@ScottNimrod这不是暴民心态,而是一种精神气质。
>
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)
> isNatural 1.;;
val it : bool = true
> isNatural 1;;
val it : bool = true