假设我有以下记录:
type t = {a:int}
为了从列表中选择字段a
的值,我执行以下操作:
let x = [{a=1};{a=2}]
let y = List.map (fun t -> t.a) x
这对我来说有点“不干净”。作为比较,在Haskell中,我会做以下事情:
data T = T { a :: Int}
x = [T {a = 1}, T {a = 2}]
y = map a x
有没有办法在Ocaml中编写类似的东西(可能使用外部库)? 如果不可能,有人可以解释为什么会出现这种限制吗?
答案 0 :(得分:9)
如果你使用Jane Street的fieldslib库,可以使用core,那么你可以写:
type t = { a:int; b:int } with fields
这样,您就可以a
和b
作为t -> int
类型的选择器函数
它还为您提供了一个名为Fields
的所谓第一类字段的子模块,其中包括选择器,mutator,以及对某些应用程序而言,关键字的字符串名称场。例如,这对于在验证函数中生成良好的错误消息非常有用。
您还可以在整个记录中获得一些高阶函数,最有用的是折叠记录。
答案 1 :(得分:6)
与标准ML不同,Ocaml没有记录的第一类选择器。(source)
至于为什么不能这样做,这只是一个设计选择。
答案 2 :(得分:3)
Haskell隐式地为字段名创建选择器函数。 OCaml不会这样做。您可以在创建记录类型时手动定义它们,它将等同于Haskell代码所做的。
type t = {a:int, b:int}
let a x = x.a
let b x = x.b