【问题标题】:Why would I use the keyword "inline" for an Active Pattern?为什么我要为活动模式使用关键字“内联”?
【发布时间】:2016-04-12 00:52:11
【问题描述】:

我仍然不明白为什么我要使用关键字inline 来表示函数。

它给了我什么我还没有的东西?

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

【问题讨论】:

标签: f# inline active-pattern


【解决方案1】:

在这种情况下,如果您尝试删除关键字,可能更容易理解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)

这意味着您可以使用 any 类型作为输入,只要存在一个函数 get_Sign 将该类型作为输入并返回 int

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

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

【讨论】:

  • 谢谢。我将 inline 的文档解释为仅用于性能。我仍然认为这是一个重要的问题,无论人们投票否决。再次感谢。
  • @ScottNimrod 我同意您所寻求的内容是有效的,但问题是针对活动模式的,并且很容易回答。如果您以不同的方式提出问题,我认为您会达到预期的结果。我花了一段时间才在不踩雷的情况下更好地提出某些类型的问题。例如,最近有人向question 询问有关文档的问题并且问题已关闭,但我提出了类似的问题并获得了赞成票。
  • @ScottNimrod 我发现如果我有问题要问,我会尽我所能,例如编写代码,修复错误,阅读文档,然后只有在所有这些都失败后,我才写下我所做的以及我需要帮助的地方,最重要的是确保这是一个客观的问题,然后我会得到很好的快速答案,通常是赞成票.是的,我确实询问过该网站被关闭并获得了很多爱(讽刺),但我完全预料到了。
  • @ScottNimrod 这不是暴民心态,而是一种精神。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2014-05-29
  • 2016-07-27
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多