2014-04-17 4 views
5

क्या कोई फ़ंक्शन के रूप में निर्माता को पास करने का कोई तरीका है?निर्माता फ़ंक्शन के लिए शॉर्टंड

type foo = 
    | Foo of int 
    | Bar of int 

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

वहाँ कार्यों foo और bar के लिए किसी भी आशुलिपि है? मैं एक कन्स्ट्रक्टर को फ़ंक्शन के रूप में पास करना चाहता हूं, लेकिन यह fun x -> Bar x लिखने के लिए अनावश्यक लगता है।

उत्तर

5

camlspotter का जवाब काफी करीब था, लेकिन आपके मामले में आप Variantslib का उपयोग करें और अपने प्रकार परिभाषा के अंत में with variants जोड़ना चाहते हैं:

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

उत्तर के लिए धन्यवाद। मुझे निराश है कि मुझे ऐसा करने के लिए एक थर्ड-पार्टी लाइब्रेरी डाउनलोड करने की आवश्यकता है, हालांकि मुझे प्रभावित है कि भाषा में वाक्य रचनात्मक विशेषताओं को जोड़ना अपेक्षाकृत सरल है। –

1

फ़ील्डस्लिब का उपयोग करें: https://github.com/janestreet/fieldslib

तरह प्रकार परिभाषा पर with fields पोस्टफ़िक्स जोड़ना:

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

और Fieldslib की वाक्य रचना विस्तार के साथ यह संकलन। यह स्वचालित रूप से आपके लिए foo और bar उत्पन्न करता है।

+0

Fieldslib है:

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

आप निम्नलिखित देता है रिकॉर्ड के लिए, योग प्रकार नहीं। यह 'प्रकार foo = {foo: int; पर काम करेगा बार: int} फ़ील्ड्स के साथ, लेकिन वास्तविक उदाहरण पर नहीं। – Virgile

+0

ओह, क्षमा करें। फिर आपको फ़ील्डस्लिब के लिए कुछ समान पी 4 एक्सटेंशन की आवश्यकता है लेकिन वेरिएंट के लिए। – camlspotter

संबंधित मुद्दे