gpt4 book ai didi

list - 如何将对象列表转换为原始数据类型?

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

我有这个代表原始类型的区分联合:

type Expr = 
| Int of bigint
| Real of float
| Symbol of string
| Bool of bool
| List of Expr list

我正在写一个函数 list : obj list -> Expr list这将检查对象的类型并将它们转换为 Expr相应地:

let rec list : (obj list -> Expr list) = function
| head::tail ->
match head with
| :? string as x'-> Symbol (x') :: list tail
| :? int as x'-> Int(bigint x') :: list tail
| :? bigint as x' -> Int x' :: list tail
| :? bool as x' -> Bool x' :: list tail
| :? float as x' -> Real x' :: list tail
| :? Expr as x' -> x' :: list tail
| :? list<obj> as x' -> List(list x') :: list tail
| _ -> []

案例| :? list<obj> as x' -> List(list x') :: list tail在这样的嵌套列表上调用此函数时似乎不匹配:list [1;[2;1]]这编译完美但返回一个错误,指出匹配案例不完整,似乎它正在尝试 mach list<int>与案件,它没有找到它。我预计 list<obj>将匹配任何类型的列表 'a但事实并非如此。 我应该编写什么模式来让它匹配任何类型的列表?该函数非常适合非嵌套对象列表。

最佳答案

您无法使用模式匹配来检查对象是否为具有未指定泛型参数的泛型类型的值。你可以看看是不是list<int>list<obj> , 但它必须是这种类型 - 所以 list<int>当您使用 :? list<obj> 检查类型时将不匹配(另外,你可以写 :? list<_> ,但编译器只会用 _ 填充 obj )

如果您只关心集合,您可以使用非通用的 System.Collections.IEnumerable所有集合(列表、数组等)实现的接口(interface):

let rec list : (obj list -> Expr list) = function
| head::tail ->
match head with
| :? string as x'-> Symbol (x') :: list tail
// Other cases you're already covering
| :? float as x' -> Real x' :: list tail
| :? Expr as x' -> x' :: list tail
| :? System.Collections.IEnumerable as x' ->
// It is a collection and we can get its elements as `obj` values!
let nested = x' |> Seq.cast |> List.ofSeq |> list
List(nested) :: list tail
| _ -> []

关于list - 如何将对象列表转换为原始数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681421/

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