2015-07-06 7 views
10

मैं कुछ वर्षों से एफ # में प्रोग्रामिंग कर रहा हूं और एक "मुद्दा" है जो मुझे कुछ समय से परेशान कर रहा है और मैं हल करने में सक्षम नहीं हूं। यह एक बग नहीं है, मुझे लगता है कि यह एक डिजाइन निर्णय है, लेकिन वैसे भी, समस्या यह है: क्या इंटरफेस के कार्यान्वयन में देरी करने का कोई तरीका है (शायद यह सही शब्द नहीं है), यानी उन्हें लागू नहीं कर रहा है प्रारंभिक परिभाषा में, लेकिन बाद में, शायद उसी फ़ाइल में जब मैंने टाइप के लिए मॉड्यूल लागू किया हो। मैं एक सरल उदाहरण के साथ समझाएंगे: मान लीजिए मैं निम्न डेटा संरचना है:इंटरफ़ेस विधियों के कार्यान्वयन में देरी?

type 'T MyCollection = 
     (*type definition*) 
     interface IEnumerable<'T> with 
      member this.GetEnumerator() = 
       (* I don't want to implement it here 
        because I still don't have the module 
        with a toSeq function *) 

मैं विधि लागू वहीं हैं, तो मैं भी प्रकार और उसके बाद के तरीकों के रूप में सभी कार्यों को लागू करने के लिए होगा विधियों को कॉल करने के लिए मॉड्यूल सिर्फ "प्रॉक्सी" होगा। इस तरह से मैं एक ओओ-प्रथम डेटा संरचना बना रहा हूं और फिर कार्यात्मक-प्रथम उपयोग की अनुमति देने के लिए एक मॉड्यूल (टाइप एनोटेशन के साथ अधिभारित) बना रहा हूं। मैं एक कार्यात्मक-प्रथम डेटा संरचना लिखना पसंद करूंगा (क्लीनर टाइप प्रकार अनुमान बेहतर काम कर सकता है) और उसके बाद ओओ रैपर बनाएं ताकि सी # जैसी भाषाओं के लिए बेहतर इंटेलिजेंस समर्थन की अनुमति मिल सके। यह दृष्टिकोण एफ # के लिए डिज़ाइन दिशानिर्देशों का अनुपालन करता है, लेकिन इंटरफ़ेस को कहीं भी लागू नहीं किया जा सकता है लेकिन इस प्रकार की प्रारंभिक परिभाषा में। वह प्रतिबंध मुझे सदस्यों के साथ पूरी डेटा संरचना लिखने के लिए मजबूर करता है। मैं उदाहरण ढूंढ रहा हूं और मुझे पता चला है कि FSharp.Core list में सूची कार्यान्वयन ठीक वही करता है जो मैं चाहता हूं, लेकिन मैं ऐसा नहीं कर सकता, संकलक मुझे नहीं जाने देगा। मुझे पूरा यकीन है कि यह एक डिज़ाइन निर्णय है, शायद बुरे प्रथाओं को प्रोत्साहित करने से बचने के लिए, मुझे नहीं पता, लेकिन मैं अपनी इच्छा को खराब अभ्यास नहीं मानता। इसके अलावा मैं fsharp संकलक की रैखिक प्रकृति के बारे में अच्छी तरह से अवगत हूं।

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

अग्रिम धन्यवाद।

उत्तर

9

मैं पूरी तरह से सहमत हूं कि यह दुर्भाग्यपूर्ण समस्या है। F # कोर लाइब्रेरी में 'a list के स्रोत कोड में उपयोग की जाने वाली चाल प्रकार इंटरफ़ेस में इंटरफ़ेस के कार्यान्वयन को परिभाषित करना है। संकलक शिकायत नहीं करता है जब आप सदस्यों को इस प्रकार किसी प्रकार से जोड़ते हैं, लेकिन यह कहता है कि इस तरह से एक इंटरफ़ेस के कार्यान्वयन को बहिष्कृत कर दिया गया है। हालांकि, यह आपको ऐसा करने से नहीं रोकता है। निम्नलिखित मेरे लिए ठीक संकलित करता है:

open System.Collections 
open System.Collections.Generic 

type MyCollection<'T> = 
    { Data : 'T list } 
    interface IEnumerable<'T> 
    interface IEnumerable 

let getEnumerator { Data = d } = 
    (d :> seq<_>).GetEnumerator() 

type MyCollection<'T> with 
    interface IEnumerable<'T> with 
    member this.GetEnumerator() = getEnumerator this 
    interface IEnumerable with 
    member this.GetEnumerator() = (getEnumerator this) :> _ 

तथ्य यह है कि यह बहिष्कृत है थोड़ा दुर्भाग्यपूर्ण है। मुझे इस शैली को काफी पसंद है और जब मैं समझ में आता हूं तो इसका इस्तेमाल करता हूं। आप start a discussion about this on F# user voice कर सकते हैं और शायद यह एक सामान्य स्वीकार किए जाते हैं सुविधा में वापस कर दिया जा सकता है :-)

+0

जवाब के लिए धन्यवाद, मैं सच में शर्मिंदा है कि मैं चीजों को मेरी समझ में गलत हो रही जा सकता था। अब तक मैंने इस मुद्दे को अपने तरीके से निपटाया है क्योंकि मेरे सभी एफ # कोड निजी इस्तेमाल के लिए हैं, मुझे ओओ भाषाओं के लिए एक अच्छा इंटरफ़ेस प्रदान नहीं करना पड़ा है। लेकिन हाल ही में मैंने fwarpx.collections (अभी भी एक पुल अनुरोध में) के लिए एक स्काईबिनोमियलहेप का कार्यान्वयन जोड़ा है और इसे एक और पारंपरिक और सार्वजनिक रूप से स्वीकार्य तरीके से निपटाना पड़ा। –

+0

हां, वह समाधान पूरी तरह से ठीक काम करता है। लेकिन मुझे डर है कि भाषा के भविष्य के संस्करण में यह बहिष्कृत से अवैध हो सकता है। एक बार फिर धन्यवाद। –

+0

[उपयोगकर्ता आवाज सबमिट की गई] (http://fslang.uservoice.com/forums/245727-f-language/suggestions/8733178-revert-back-to-an-accepted-feature-the-delayed-imp) –

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