El más corto que podría salirse con la teoría es:
frobnicate (function
| 0x01 -> gets , a_record_uuid
| 0x02 -> gets , a_group
...
)
Por supuesto, usted será frustrado por OCaml porque: 1 ° No hay "puntero a miembro" construye en Objective Caml, por lo que lo haría tener que escribir fun a s -> a.a_record_uuid <- s
en lugar de a_record_uuid
(por lo menos) y 2 ° el sistema de tipos no es totalmente compatible cuantificación existencial, por lo que el tipo de retorno de la función no puede ser la esperada:
exists 'a. int -> (unit -> record * 'a) * ('a -> record -> unit)
Creo que se puede resolver 1 ° por tener funciones con nombre para establecer valores en un registro, si quieres pasar a hacerlo con la suficiente frecuencia:
type complex = { re : int ; im : int }
let re r c = { c with re = r }
let im r c = { c with im = i }
Es un poco ortodoxo, supongo, pero por lo general vale la pena más adelante porque tiendo a usarlos en la mayoría de las situaciones funcionales. Podría crear el equivalente en estilo imperativo, o podría aceptar la sobrecarga de una función (solo agrega alrededor de 20 caracteres).
como o 2 °, que puede ser resuelto por ocultar el cuantificador existencial en una función:
let t e read write = let c, x = read() in write x e ; `More_record c
Esto le permitiría bajar a:
let t = t a in
match
| 0x01 -> t gets a_record_uuid
| 0x02 -> t gets a_title
...
que no se sorprendería si CamlP4 admite algún tipo de azúcar para las funciones de asignación. Por el momento, si utiliza referencias en lugar de campos variables, se puede acortar esto (porque las referencias son valores de primera clase, los campos no son):
let t read reference = let c, x = read() in reference := x ; `More_record c
match
| 0x01 -> t gets a.a_record_uuid
...
Vergonzosamente simple. – mbac32768