【发布时间】:2020-10-17 08:05:24
【问题描述】:
我想使用以下类型
type RecordPath<'a,'b> = {
Get: 'a -> 'b
Path:string
}
它的目的是定义一个getter,用于从记录类型'a 到'a 中的'b 类型的某个字段。它还为记录的 json 表示形式提供了该字段的路径。
例如,考虑以下字段。
type DateWithoutTimeBecauseWeirdlyDotnetDoesNotHaveThisConcept = {
Year:uint
Month:uint
Day:uint
}
type Person = {
FullName:string
PassportNumber:string
BirthDate:DateWithoutTimeBecauseWeirdlyDotnetDoesNotHaveThisConcept
}
type Team = {
TeamName:string
TeamMembers:Person list
}
RecordPath 的例子可能是
let birthYearPath = {
Get = fun (team:Team) -> team.TeamMembers |> List.map (fun p -> p.BirthDate.Year)
Path = "$.TeamMember[*].BirthDate.Year" //using mariadb format for json path
}
是否有某种方法可以让图书馆用户创建此记录,而实际上不需要明确指定字符串。理想情况下,用户可以通过某种强类型的方式来指定所涉及的字段。也许某种巧妙地使用反射?
我突然想到,使用支持宏的语言,这是可能的。但是可以在 F# 中完成吗?
PS:我注意到我在路径中遗漏了“TeamMembers”中的 s。为了让用户更容易使用,我想提防这种事情。
【问题讨论】:
-
我认为这里可能有一个涉及代码引用的答案。如果我弄清楚了,我会发布它。
-
你有一个getter,你有一个json路径,两者都“指向”同一个字段。你想用json路径做什么?
-
@scrwtp 我正在支持外键和 cosmos 和 mongo 的其他缺点的 rdms 之上制作一个 nosql 库。对于这个涉及代码引用的特定问题,我几乎有一个解决方案,我将在明天发布。
-
好的,很酷。但是,它并没有解释您需要 json 路径来做什么。
-
json 路径使 rdms 知道如何生成可以索引的计算列。
标签: reflection f#