ventajas val learn for example effective docs desventajas ocaml

val - ocaml vs haskell



{X con valor} en ocaml (2)

Esto a veces se denomina "actualización de registro" o "actualización funcional" o algo así. Se evalúa a un nuevo registro del mismo tipo que X, y cuyos campos se inicializan al mismo que los de X, excepto los que se enumeran después del "con", que se inicializan con los valores dados.

Es útil para registros inmutables, como una forma conveniente de tomar dicho registro y cambiar una o dos cosas en él (que en un lenguaje imperativo en el que normalmente se muta los campos), sin tener que enumerar todos los campos que no se modifican. .

Se describe en la sección 6.7.3 del manual de OCaml, desplácese hacia abajo hasta "Registros", segundo párrafo.

Para aquellos que están familiarizados con Haskell, la sintaxis OCaml

{ expr with field1 = expr1 ; ... ; fieldn = exprn }

es la misma que la sintaxis de Haskell

expr { field1 = expr1 , ... , fieldn = exprn }

Vi la siguiente llamada de función en el ejemplo de Yacfe :

Visitor_c.vk_program { Visitor_c.default_visitor_c with Visitor_c.kexpr = (fun (k, bigf) exp -> match Ast_c.unwrap_expr exp with | Binary(e1, Logical (Eq), (((Constant(Int("0")) as _e2),_t),ii)) -> (match Ast_c.get_onlytype_expr e1 with | Some (qu, (Pointer _,_ii)) -> let idzero = Common.tuple_of_list1 ii in idzero.cocci_tag := Ast_cocci.MINUS (Ast_cocci.NoPos, [[null_addon]]), []; | _ -> k exp ) | _ -> k exp ); } ast;

Puedo ver una llamada de función con el registro inicializado como el primer argumento, y ast como el segundo argumento.

Lo que no conozco es la sintaxis de la forma:

{Visitor_c.default_visitor_c with Visitor_c.kexpr = some_value;}

¿Qué significa esto? Sé que un registro se puede inicializar como {name=value;name=value;...} , pero no estoy familiarizado con la {X with name=value} , ¿puede decirme qué significa?

No puedo encontrar en el Manual de Ocaml nada sobre la inicialización del valor de registro legal que no sea lo siguiente:

6.2.3 Registros

Los valores de registro se etiquetan tuplas de valores. El valor de registro escrito {field1 = v1; ...; fieldn = vn} asocia el valor vi al campo de registro fieldi, para i = 1 ... n. La implementación actual admite registros con hasta 222 - 1 campos (4194303 campos).

Me alegraré si en su respuesta incluirá una referencia a la sección correspondiente en el manual de OCaml.


Para corregir la respuesta anterior, el nuevo registro no siempre es del mismo tipo que el registro anterior. Por ejemplo, puedes tener algo así:

type ''a t = { id : int; value : ''a; } let old_t = { id = 3; value = "foo" } let new_t = { old_t with value = 3 }

Como resultado, old_t es de tipo string t , mientras que new_t es de tipo int t .