OCaml में, यह .mli
में है करने के लिए कानूनी है:η विस्तार
val f : 'a -> 'a
val g : 'a -> 'a
और .ml
:
let f x = x
let g = f
एफ # में
फिर भी, यह अस्वीकार कर दिया गया है:
eta_expand.ml(2,5): error FS0034: Module 'Eta_expand' contains
val g : ('a -> 'a)
but its signature specifies
val g : 'a -> 'a
The arities in the signature and implementation differ. The signature specifies that 'g' is function definition or lambda expression accepting at least 1 argument(s), but the implementation is a computed function value. To declare that a computed function value is a permitted implementation simply parenthesize its type in the signature, e.g.
val g: int -> (int -> int)
instead of
val g: int -> int -> int.
एक वर्कअराउंड जी की परिभाषा को बढ़ाने के लिए है:
let g x = f x
अगर मेरे कोड (पूरी तरह कार्यात्मक (कोई अपवाद नहीं, कोई साइड इफेक्ट, आदि) इस बराबर होना चाहिए वास्तव में, इसे और भी बेहतर कैसे भाषा प्रकार पर निर्भर करता है सामान्यीकरण करता बहुरूपता के संबंध में हो सकता है,: OCaml में आंशिक अनुप्रयोग polymorphic कार्यों का उत्पादन नहीं करते हैं, लेकिन उनके η-विस्तार करता है)।
क्या व्यवस्थित η-विस्तार के लिए कोई कमी है?
दो उत्तरों η-विस्तार :-) पर प्रश्न को हल करते हैं और इसके बजाय सुझाव देते हैं कि मैं अपने कार्यात्मक प्रकार के चारों ओर कोष्ठक जोड़ता हूं। ऐसा इसलिए है क्योंकि जाहिर है, एफ # कार्यों की "सत्य" परिभाषा के बीच टाइपिंग स्तर पर भिन्न होता है (जैसे λ-expressions और गणना की परिभाषाएं, आंशिक अनुप्रयोगों में); संभवतः ऐसा इसलिए है क्योंकि λ-expressions सीधे सीएलआर कार्यों को मानचित्र करते हैं जबकि गणना की गई परिभाषाएं वस्तुओं को प्रतिनिधि करने के लिए मानचित्र बनाती हैं। (मैं इस व्याख्या के बारे में सुनिश्चित नहीं कर रहा हूँ और अगर किसी को एफ # से परिचित दस्तावेजों इस का वर्णन संदर्भ को इंगित सराहना करेंगे।)
एक समाधान व्यवस्थित .mli
में सभी समारोह प्रकार को कोष्ठकों जोड़ने के लिए होगा, लेकिन मुझे डर है कि इससे अक्षमता हो सकती है। एक और गणना गणना कार्यों का पता लगाने और .mli
में संबंधित प्रकारों को संश्लेषित करना होगा। एक तीसरा समाधान स्पष्ट मामलों को विस्तारित करना होगा, और दूसरों को संश्लेषित करना होगा।
मैं एफ #/सीएलआर आंतरिक के साथ पर्याप्त परिचित नहीं हूं, यह मापने के लिए कि कौन से महत्वपूर्ण प्रदर्शन या जुर्माना लगा रहे हैं।
बस इसे 'वैल जी: (' ए -> 'ए)' बनाओ। यह एफ # प्रकार प्रणाली की एक ज्ञात विशेषता/बग है। –
फिर से, "बस इसे बनाएं" - संभवतः अगर λ-expressions और computed कार्यों में विस्थापन योग्य प्रकार नहीं हैं, तो यह अच्छे कारण के लिए है। इसके अलावा, यह स्वत: उत्पन्न कोड है, इस प्रकार मामला मैन्युअल रूप से कुछ कोष्ठक जोड़ने से थोड़ा अधिक जटिल है ... –
इस मामले में दोनों के बीच एक अंतर है, एक विधि में संकलित किया गया है और दूसरा स्थिर ' Func 'संपत्ति। संगतता बिडरेक्शनल नहीं है (यानी, 'ए -> बी: <: (a -> बी) ', लेकिन नहीं' (ए -> बी): <: a -> बी')। –