gpt4 book ai didi

opa - 访问一条记录,过滤类型为 sum 的列表后

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

我有一个列表

type my_sum = {a : type_a} / {b : type_b}
mylist = [{field_only_in_a = "test"} : type_a,{haha=3 ; fsd=4} : type_b]

我想这样做:

result = List.find( a -> match a with 
| {a = _} -> true
| _ -> false
end,
mylist)
if Option.is_some(result) then
Option.some(Option.get(result).field_only_in_a)
else
Option.none

如您所见,在找到之后我肯定会得到 type_a 的东西,但在编译时我会得到:

    Record has type
{ a : type_a } / { b : type_b } but field access expected it to have type
{ field_only_in_a: 'a; 'r.a }
Hint:
You tried to access a sum type with several cases as a record.

我怎么能对编译器说,我只提取了一种总和类型,而且我有合适的类型来访问记录...?

最佳答案

好吧,您不能真正通知编译器列表中只存在一个子类型……但是您可以显式地创建一个仅包含该子类型的列表。其实你要找的是List.find_map它找到符合特定条件的第一个元素并将其映射(您使用此映射从 my_sum 投影到它的大小写 type_a )。下面是一个完整的工作代码(自行编译):

type type_a = {fld_a : string}
type type_b = {fld_b : int}
type my_sum = {a : type_a} / {b : type_b}

mylist = [{a = {fld_a = "test"}}, {b = {fld_b = 10}}] : list(my_sum)

get_first_a(l : list(my_sum)) : option(type_a) =
List.find_map(
(el -> match el
| ~{a} -> some(a)
| _ -> none
), l)

_ = prerr("First a-typed element of {mylist} is {get_first_a(mylist)}\n")

如果没有List.find_map stdlib 中的函数仍然有很多方法可以做到这一点。可能最简单的是使用 List.filter_map获得list(type_a)然后用 List.head_opt 得到它的头.

关于opa - 访问一条记录,过滤类型为 sum 的列表后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681128/

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