gpt4 book ai didi

types - 可以定义一个函数来判断一个元素是否是从给定的类型构造函数构造的吗?

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

我在 F# 中工作,并且有一个 T 类型,它是几个事物的有区别的联合:

type T =
| A of string * int
| B of int
| C

如果我有一个 T 列表,我可能想提取使用 A 构造的东西。像这样进行模式匹配很容易:

myList
|> List.filter (fun x -> match x with | A(_,_) -> true | _ -> false)

嵌入式匹配有点冗长,并且在保持下划线数量与 A 的定义同步方面存在一些维护麻烦。我真的很喜欢这样的函数:

let constructedFrom (type constructor) (t : T) : bool = something

myList
|> List.filter (constructedFrom A)

有没有办法定义这个“constructedFrom”函数?

最佳答案

The embedded match is a bit verbose, and there's a minor maintenance hassle in keeping the number of underscores in sync with the definition of A.

您可以使用 function 关键字来节省一些击键次数。您还可以使用 _ 作为忽略所有内容的模式(这并不意味着您必须绑定(bind)到单个值)。

myList
|> List.filter (function A _ -> true | _ -> false)

一般来说,如果你重复写上面的函数,你应该定义几个active patterns , 每种情况一个:

let (|ACase|_|) = function 
| A _ as x -> Some x
| _ -> None

myList |> List.choose (|ACase|_|)

Is there a way to define this 'constructedFrom' function?

没有惯用的方法可以做到这一点。我认为大多数时候主动模式可以解决这个问题。

关于types - 可以定义一个函数来判断一个元素是否是从给定的类型构造函数构造的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20171531/

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