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

时间:2011-05-14 18:35:41

标签: ocaml record

假设我有以下记录:

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中编写类似的东西(可能使用外部库)? 如果不可能,有人可以解释为什么会出现这种限制吗?

3 个答案:

答案 0 :(得分:9)

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

type t = { a:int; b:int } with fields

这样,您就可以ab作为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