gpt4 book ai didi

f# - 为什么要为事件模式使用关键字 "inline"?

转载 作者:行者123 更新时间:2023-12-01 05:49:25 25 4
gpt4 key购买 nike

我仍然不明白为什么我要为一个函数使用关键字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<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

关于f# - 为什么要为事件模式使用关键字 "inline"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36561769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com