2014-04-17 12 views
5

Gibt es eine Möglichkeit, einen Konstruktor als Funktion zu übergeben?Kurzschrift für Konstruktorfunktion

type foo = 
    | Foo of int 
    | Bar of int 

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

Gibt es eine Abkürzung für die Funktionen foo und bar? Ich möchte einen Konstruktor als eine Funktion übergeben, aber es scheint unhandlich zu schreiben fun x -> Bar x.

Antwort

5

Antwort des camlspotter war nahe genug, aber in Ihrem Fall, dass Sie Variantslib verwenden und with variants am Ende Ihrer Typdefinition hinzufügen:

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

Ihr das gibt folgendes:

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

Danke für die Antwort. Ich bin enttäuscht, dass ich eine Bibliothek von Drittanbietern herunterladen muss, um das zu tun, obwohl ich beeindruckt bin, dass es relativ einfach ist, der Sprache syntaktische Merkmale hinzuzufügen. –

1

Verwenden Sie Fieldslib: https://github.com/janestreet/fieldslib.

Hinzufügen with fields Postfix bei der Typdefinition wie:

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

und kompilieren Sie es mit Fieldslib Syntax-Erweiterung. Es generiert automatisch foo und bar für Sie.

+0

Fieldslib ist für Datensätze, nicht Summenarten. Es würde am 'type foo = {foo: int; bar: int} mit Feldern ', aber nicht am aktuellen Beispiel. – Virgile

+0

Oh, Entschuldigung. Dann brauchst du etwas ähnliches P4-Erweiterung zu Fieldslib aber für Varianten. – camlspotter

Verwandte Themen