gpt4 book ai didi

list - 与 List 类型匹配的 FSharp 模式

转载 作者:行者123 更新时间:2023-12-02 21:29:41 26 4
gpt4 key购买 nike

我想根据实际类型来匹配“obj”类型的对象 obj1。问题在于列表类型的类型检查模式(下例中的第二个)与 F# 列表不匹配。

let obj1 = [1;2;3] :> obj
match obj1 with
| :? System.Array as a -> printfn "it's an array: %A" a
| :? List<_> as l -> printfn "It's a list: %A" l
| _ -> printfn "other type"

输出“其他类型”,而我希望它是“这是一个列表:[1;2;3]”

如何正确检查列表类型?

最佳答案

Daniel Fabian 已经在他的回答中解释了这个问题。

实现他的解决方案的一种方法是使用 Active Pattern :

let (|IsList|_|) (candidate : obj) =
let t = candidate.GetType()
if t.IsGenericType && t.GetGenericTypeDefinition() = typedefof<list<_>>
then Some (candidate :?> System.Collections.IEnumerable)
else None

您现在可以更改匹配以使用此事件模式:

let obj1 = [1;2;3] :> obj
match obj1 with
| :? System.Array as a -> printfn "it's an array: %A" a
| IsList l -> printfn "It's a list: %A" l
| _ -> printfn "other type"

打印:

> It's a list: [1; 2; 3]

关于list - 与 List 类型匹配的 FSharp 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405768/

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