2016-10-06 5 views
5

संदर्भित होने पर पैरामीटर रहित कार्यों को पैरामीटर दिया जा रहा है मुझे फ़ेबल में पैरामीटर रहित फ़ंक्शंस का जिक्र करने में कठिनाई हो रही है।जावास्क्रिप्ट में Fable F #:

इस उदाहरण के साथ:

let f1() = 
    1 

let someRefTof1 = f1 

मैं उत्पन्न js कुछ इस तरह देखने के लिए उम्मीद थी:

function f1() { 
    return 1; 
} 

var someRefTof1 = f1; 

लेकिन क्या मैं वास्तव में मिलता है:

function f1() { 
    return 1; 
} 

var someRefTof1 = exports.someRefTof1 = function someRefTof1(arg00_) { 
    return f1(arg00_); 
}; 

मैं arg00_ के उद्देश्य पर अस्पष्ट नहीं है या इसे उत्पन्न करने से कैसे बचें?

(पृष्ठभूमि का एक सा के रूप में, मैं एक बाहरी जे एस पुस्तकालय में एक समारोह जो उम्मीद एक समारोह एक पैरामीटर के रूप प्रदान किया जाने वाला कॉल करने के लिए संघर्ष कर रहा हूँ)


संपादित करें:

पृष्ठभूमि

उपर्युक्त है जो मुझे लगता है कि मेरे प्रश्न का एक न्यूनतम, सत्यापन योग्य, प्रजनन है, लेकिन टिप्पणियों के बाद, मैंने सोचा कि यह एक और अधिक संदर्भ प्रदान करने के लिए उपयोगी हो सकता है कि यह समस्या क्यों पैदा कर रहा है। मैं वास्तव में क्या करने की कोशिश कर रहा हूं फेल से कोणीय का उपयोग करें।

तो मेरी उदाहरण इस तरह अधिक लग रहा है: unitVar समस्याग्रस्त पैरामीटर इस उदाहरण में पेश होने के साथ

var app = exports.app = angular.module("app", []); 

var TestCtrl = exports.TestCtrl = function() { 
    function TestCtrl() { 
     _classCallCheck(this, TestCtrl); 
    } 

    TestCtrl.prototype.Val1 = function Val1() { 
     return "boom"; 
    }; 

    return TestCtrl; 
}(); 

_fableCore.Util.setInterfaces(TestCtrl.prototype, [], "App.TestCtrl"); 

app.controller("test", function (unitVar) { 
    return new TestCtrl(); 
}); 

:

let app = AngularFable.NgFable.angular.``module``("app",[||]) 

type TestCtrl() = 
    member this.Val1() = "boom"; 

app?controller("test", TestCtrl) 

का संकलन किया जाता है। जब मैं की तरह कुछ के साथ मेरी html में इस का उपयोग करें:

<div ng-app="app"> 
    <div ng-controller="test as vm"> 
     {{vm.Val1()}} 
    </div> 
    </div> 

मैं एक unknown provider त्रुटि प्राप्त जबकि अगर मैं बस इस तरह अंतिम पंक्ति से unitVar पैरामीटर दूर करने के लिए संकलित जावास्क्रिप्ट बदलने के लिए:

app.controller("test", function() { 
    return new TestCtrl(); 
}); 

तो मेरा उदाहरण अपेक्षा के अनुसार काम करता है।

मैं वास्तव में जानना चाहता हूं कि फ़ेबल कंपाइलर इस पैरामीटर को उत्पन्न करने से बचने का कोई तरीका है या नहीं। मुझे 99% यकीन है कि यह मेरे मूल प्रश्न में एक ही समस्या को कम कर देता है लेकिन मैंने यह अतिरिक्त संदर्भ शामिल किया है कि यह एक मुद्दा है

+4

यह सुनिश्चित नहीं है कि यह प्रासंगिक है, लेकिन फ़ंक्शन वास्तव में पैरामीटर रहित नहीं है, इसमें टाइप यूनिट का एक पैरामीटर है। –

+0

हाँ, अच्छा बिंदु लेकिन यह मूल 'paramterless' फ़ंक्शन को अपेक्षित रूप से मानचित्रित करता है - यह तब होता है जब उस फ़ंक्शन को संदर्भ दिया जाता है कि समस्या उत्पन्न होती है –

+0

वास्तव में क्या समस्या है? 'Arg00_' के साथ मैं देख सकता हूं कि एकमात्र मुद्दा यह है कि यदि आप इसे कुछ जावास्क्रिप्ट कोड में पास करते हैं जो' f.length' का उपयोग तर्कों की घोषित संख्या प्राप्त करने के लिए करता है, जो अत्यधिक निराश अभ्यास है। अन्यथा इसे कुछ भी नहीं बदला जाना चाहिए। – Tarmil

उत्तर

7

आपके प्रश्न और विस्तृत स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। यहां दो चीजें हैं जो थोड़ी मुश्किल हैं और एफ # कंपाइलर और फेल दोनों ऑप्टिमाइज़ेशन के कारण होती हैं।

  • एफ # संकलक द्वारा प्रदान की एएसटी में, विधियों (कार्यों है कि एक प्रकार या मॉड्यूल के सदस्य हैं) सी # में के रूप में हमेशा की तरह तरीके के रूप में संकलित किया गया है। यह अनुकूलन के लिए है।
  • हालांकि, जब आप एक अनाम लैम्ब्डा बनाते हैं या किसी विधि का संदर्भ देते हैं, तो एफ # कंपाइलर एफ # सेमेन्टिक्स रखेगा, यानी, सभी कार्यों में एक ही तर्क होता है (जैसा कि जॉन पामर कहते हैं, unit भी एक तर्क है) और कर सकते हैं घुमाओ

ठीक है, यह जानकारी सिर्फ यह स्पष्ट करने के लिए है कि एफ # कंपाइलर/फबल अलग-अलग तरीकों और लैम्ब्स का प्रतिनिधित्व क्यों करता है। आइए तर्कहीन कार्यों के मुद्दे के साथ चलें: unit (जैसा कि यह पहले से ही विधियों के लिए किया गया है) स्वीकार करने वाले कार्यों के लिए F # कंपाइलर जेनरेट तर्क को निकालने का स्पष्ट समाधान होगा। वास्तव में, मुझे इसके कारण मोचा जैसे पुस्तकालयों में भी समस्याएं थीं।

मैंने शुरुआत में unit तर्क को हटाने का प्रयास किया लेकिन मैं इसके कारण कुछ परिदृश्यों में विफल रहा। टीबीएच, मुझे अब याद नहीं है कि कौन से परीक्षण विफल रहे थे, लेकिन उम्मीद की वजह से हमेशा एक तर्क होगा, कुछ मामलों में कार्य रचना या इनलाइनिंग विफल रही थी जब unit तर्क हटा दिया गया था।

जेएस रनटाइम में एफ # फ़ंक्शंस के अर्थशास्त्र को संशोधित करने के अन्य प्रयास हमेशा विफल रहे हैं क्योंकि वे सभी परिदृश्यों को कवर नहीं करते हैं। हालांकि, हम प्रतिनिधियों (System.Func<>) के साथ अधिक उदार हो सकते हैं क्योंकि यह आमतौर पर यह मानना ​​सुरक्षित है कि इन लोगों को सी # या एफ # जैसी भाषाओं में अधिक काम करना चाहिए। मैं केवल प्रतिनिधियों के लिए इकाई तर्क को हटाने का प्रयास कर सकता हूं और देख सकता हूं कि क्या होता है :)

जेएस कोड में एफ # फ़ंक्शंस भेजने के बारे में अधिक जानकारी के लिए आप documentation देख सकते हैं।

अद्यतन: उन सभी को स्क्रैच करें, कृपया [email protected] और [email protected] आज़माएं। यह संस्करण unit तर्कों को समाप्त करता है, समाधान वास्तव में मेरे विचार से सरल था और (उम्मीद है कि) मौजूदा परियोजनाओं के साथ मुद्दों को नहीं बनाना चाहिए। (तरीकों और लैम्ब्स के संकलन के बारे में स्पष्टीकरण अलग-अलग लागू होता है।)

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