Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么我要使用关键字“quot;内联“;对于活动模式?_F#_Inline_Active Pattern - Fatal编程技术网

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