gpt4 book ai didi

f# - 从字符串创建可区分联合大小写

转载 作者:行者123 更新时间:2023-12-03 23:50:35 27 4
gpt4 key购买 nike

我正在尝试从字符串创建 DU 案例。我能看到这样做的唯一方法是通过 Microsoft.FSharp.Reflection.FSharpType.GetUnionCases 枚举 DU 案例。然后选择 UnionCase匹配字符串(通过使用 .Name ),然后通过使用 FSharpValue.MakeUnion 使实际的 DU 大小写出来.

没有更简单/更优雅的方法来做到这一点吗?在我的场景中,我有一个包含数百个关键字案例的 DU。我必须从文件中读取字符串(关键字)并从中提取类型。我通过将案例放入 Map 进行了一些“优化”,但我希望有更好的方法来做到这一点。

我有以下内容,例如:

type Keyword = 
| FOO
| BAR
| BAZ
| BLAH

let mkKeywords (file: string) =
use sr = new StreamReader(file)

let caseMap =
FSharpType.GetUnionCases(typeof<Keyword>)
|> Array.map (fun c -> (c.Name, FSharpValue.MakeUnion(c, [||]) :?> Keyword))
|> Map.ofArray

[
while not sr.EndOfStream do
let l = sr.ReadLine().Trim()

match caseMap.TryFind l with
| Some c -> yield c
| None -> failwith <| "Could not find keyword: " + l
]

最佳答案

我找到了 this方便的代码片段...

open Microsoft.FSharp.Reflection

let toString (x:'a) =
let (case, _ ) = FSharpValue.GetUnionFields(x, typeof<'a>)
case.Name

let fromString<'a> (s:string) =
match FSharpType.GetUnionCases typeof<'a> |> Array.filter (fun case -> case.Name = s) with
|[|case|] -> Some(FSharpValue.MakeUnion(case,[||]) :?> 'a)
|_ -> None
...这使得在任何 DU 上添加两行代码变得容易...
type A = X|Y|Z with
override this.ToString() = FSharpUtils.toString this
static member fromString s = FSharpUtils.fromString<A> s

关于f# - 从字符串创建可区分联合大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21559497/

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