gpt4 book ai didi

generics - F# 中的严格泛型枚举转换

转载 作者:行者123 更新时间:2023-12-03 06:22:31 24 4
gpt4 key购买 nike

我想写一个带有签名 int -> 'TEnum 的函数如果目标枚举不包含输入值,则会抛出异常。这是我的第一次尝试:

let parseEnum<'TEnum when 'TEnum : enum<int>> (value : int) : 'TEnum =
let enumType = typeof<'TEnum>
if not <| Enum.IsDefined (enumType, value) then
raise <| ArgumentException (sprintf "Invalid value of %A: %d" enumType value)

enum value

编译器向我显示以下错误消息:“错误 FS0001:声明的类型参数 'TEnum' 不能在此处使用,因为类型参数无法在编译时解析”(我认为这是因为 enum 函数有一个额外的约束)。

好吧,好吧,我明白这个问题了。我将使用statically resolved type parameter 。这是我的第二次尝试:

let inline parseEnum2 (value : int) : ^TEnum =
let enumType = typeof<^TEnum>
if not <| Enum.IsDefined (enumType, value) then
raise <| ArgumentException (sprintf "Invalid value of %A: %d" enumType value)

enum value

但编译器仍然提示:“错误 FS3156:意外的标记 '>' 或不完整的表达式”在 typeof<^TEnum> 行.

我做错了什么?我该如何编写这个函数?

最佳答案

您只需要在“帽子”符号 ˆ 之间留一个空格即可和 <像这样:

let enumType = typeof< ^TEnum>

其实你不需要帽子,你可以这样写:

open System
let inline parseEnum2 value : 'TEnum =
let enumType = typeof<'TEnum>
if not <| Enum.IsDefined (enumType, value) then
raise <| ArgumentException (sprintf "Invalid value of %A: %d" enumType value)

enum value

因为在这种情况下静态约束是自动推断的,所以真正需要编写“帽子”的唯一地方是手动编写静态约束。

关于generics - F# 中的严格泛型枚举转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34102084/

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