Ocaml:如何"轻松"将记录列表映射到record.field列表?

Cal*_*lin 6 ocaml record

假设我有以下记录:

type t = {a:int}
Run Code Online (Sandbox Code Playgroud)

为了a从列表中选择字段的值,我执行以下操作:

let x = [{a=1};{a=2}]
let y = List.map (fun t -> t.a) x
Run Code Online (Sandbox Code Playgroud)

这对我来说有点"不干净".作为比较,在Haskell中我会做以下事情:

data T = T { a :: Int}  
x = [T {a = 1}, T {a = 2}]
y = map a x
Run Code Online (Sandbox Code Playgroud)

有没有办法在Ocaml中编写类似的东西(可能使用外部库)?如果不可能,有人可以解释为什么这个限制?

yzz*_*zlr 9

如果您使用Jane Street的fieldslib库,可以使用core,那么您可以编写:

type t = { a:int; b:int } with fields
Run Code Online (Sandbox Code Playgroud)

这会给你ab作为类型的选择器函数t -> int

它还为您提供了一个名为Fields所谓的第一类字段的子模块,其中包括选择器,mutator,以及对于某些应用程序而言,该字段的字符串名称.例如,这对于在验证函数中生成良好的错误消息非常有用.

您还可以在整个记录中获得一些高阶函数,最有用的是折叠记录.


Seb*_*olm 6

与标准ML不同,Ocaml没有用于记录的一流选择器.(来源)

至于为什么不能这样做,那只是一个设计选择.