2014-04-17 13 views
5

Czy istnieje jakiś sposób przekazania konstruktora jako funkcji?Skrócona instrukcja funkcji konstruktora

type foo = 
    | Foo of int 
    | Bar of int 

let foo x = Foo x 
let bar = fun x -> Bar x 

Czy istnieje skrótem funkcji foo i bar? Chcę przekazać konstruktora jako funkcję, ale wydaje się nieporęczne, aby napisać fun x -> Bar x.

Odpowiedz

5

camlspotter był wystarczająco blisko, ale w przypadku, gdy chcesz użyć Variantslib i dodać with variants na końcu swojej definicji typu:

type foo = Foo of int | Bar of int with variants;; 

daje następujące:

type foo = Foo of int | Bar of int 
val bar : int -> foo = <fun> 
val foo : int -> foo = <fun>              
module Variants : 
    sig 
    val bar : (int -> foo) Variantslib.Variant.t 
    val foo : (int -> foo) Variantslib.Variant.t 
    end 
+1

Dzięki za odpowiedź. Jestem rozczarowany, że muszę pobrać bibliotekę firm trzecich, aby to zrobić, chociaż jestem pod wrażeniem, że stosunkowo łatwo jest dodać do języka funkcje syntaktyczne. –

1

Użyj Fieldslib: https://github.com/janestreet/fieldslib.

Dodawanie with fields postfix w definicji typu takich jak:

type foo = | Foo of int | Bar of int with fields 

i skompilować go z Fieldslib za rozszerzenie składni. Automatycznie generuje dla Ciebie foo i bar. Odpowiedź

+0

Fieldslib jest dla rekordów, a nie typów sum. To działałoby na 'type foo = {foo: int; bar: int} with fields', ale nie na faktycznym przykładzie. – Virgile

+0

Och, przepraszam. Następnie potrzebujesz czegoś podobnego do rozszerzenia P4 do Fieldslib, ale do wariantów. – camlspotter

Powiązane problemy