假设我有以下记录:
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中编写类似的东西(可能使用外部库)?如果不可能,有人可以解释为什么这个限制?
如果您使用Jane Street的fieldslib库,可以使用core,那么您可以编写:
type t = { a:int; b:int } with fields
Run Code Online (Sandbox Code Playgroud)
这会给你a
和b
作为类型的选择器函数t -> int
它还为您提供了一个名为Fields
所谓的第一类字段的子模块,其中包括选择器,mutator,以及对于某些应用程序而言,该字段的字符串名称.例如,这对于在验证函数中生成良好的错误消息非常有用.
您还可以在整个记录中获得一些高阶函数,最有用的是折叠记录.
归档时间: |
|
查看次数: |
1466 次 |
最近记录: |