f# properties record accessor higher-order-functions

F#Acceso de propiedad de orden superior



properties record (2)

Acabo de actualizar mi tupla de creación de prototipos a un registro. Algún día puede convertirse en una clase real. Mientras tanto, quiero traducir un código como este:

type Example = int * int let examples = [(1,2); (3,4); (5,6)] let descs = Seq.map (fst >> sprintf "%d") examples

a esto:

type Example = { Field1 : int Field2 : int Description : string } let examples = [{Field1 = 1; Field2 = 2; Description = "foo"} {Field1 = 3; Field2 = 4; Description = "bar"} {Field1 = 5; Field2 = 6; Description = "baz"}] let descs = Seq.map Description examples

El problema es que esperaba obtener una función Description : Example -> string cuando declare el registro de Ejemplo, pero no lo hago. He hurgado un poco y probado propiedades en las clases, pero eso tampoco funciona. ¿Me falta algo en la documentación o tendré que escribir accesos de mayor orden manualmente? (Esa es la solución que estoy usando ahora).


examples |> Seq.map (fun e -> e.Description)

(Declarar un registro no crea ninguna función asociada, pero el registro tiene propiedades, por lo que una lambda pequeña como la anterior facilita la proyección de ciertos campos).


Estoy de acuerdo en que sería bueno tener alguna forma de usar miembro de instancia como un valor de función en F # (sin construir explícitamente la función lambda). Esto ha sido discutido algunas veces en la comunidad F #. Aquí hay un enlace relacionado:

Algunas de las opciones sugeridas de esa discusión son:

// This would turn ''_'' automatically into a lambda parameter // (this looks okay in simple cases, but doesn''t probably scale well) examples |> Seq.map (_.Description) // You would specify instance member using special ''#'' symbol examples |> Seq.map (Example#Description)

Entonces, esto es algo de lo que el equipo F # está al tanto, pero no creo que haya ninguna conclusión sobre si esta es realmente esa característica importante y cuál sería la mejor manera de respaldarla.