gpt4 book ai didi

f# - F#:如何优雅地选择和分组受歧视的工会?

转载 作者:行者123 更新时间:2023-12-03 14:37:03 24 4
gpt4 key购买 nike

说我有一个形状列表:

type shape = 
| Circle of float
| Rectangle of float * float

let a = [ Circle 5.0; Rectangle (4.0, 6.0)]


我该如何测试例如一个圆存在吗?我可以为每个形状创建一个函数

let isCircle s = 
match s with
| Circle -> true
| _ -> false
List.exists isCircle a


但是我觉得F#中必须有一种更优雅的方法,除了必须为每种形状类型定义这样的功能。在那儿?

相关问题是如何根据形状类型对形状列表进行分组:

a |> seq.groupBy( <shapetype? >)

最佳答案

您可以将F#反射与引号结合使用以获得通用解决方案

open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns

type Shape =
| Circle of float
| Rectangle of float * float

let isUnionCase (c : Expr<_ -> 'T>) =
match c with
| Lambda (_, NewUnionCase(uci, _)) ->
let tagReader = Microsoft.FSharp.Reflection.FSharpValue.PreComputeUnionTagReader(uci.DeclaringType)
fun (v : 'T) -> (tagReader v) = uci.Tag
| _ -> failwith "Invalid expression"

let a =
[ Circle 5.0; Rectangle (4.0, 6.0)]
|> List.filter (isUnionCase <@ Rectangle @>)
printf "%A" a

关于f# - F#:如何优雅地选择和分组受歧视的工会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363184/

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