F #

2009-03-23 12 views
23

में तर्कों की चरणीय संख्या लेने वाले फ़ंक्शन को कैसे लिखें, मुझे सी # में एक फ़ंक्शन मिला है, और मैं इसे करने के लिए केवल F # पर पोर्ट (कुछ अन्य सामानों के बीच) पोर्ट करना चाहता हूं। दुर्भाग्य से, मैं सिर्फ वहाँ एफ # में यह व्यक्त करने के लिए कोई रास्ता नहीं हो रहा है, जिसके लिए एक मामला मारा: इस सी # समारोहF #

public static T Min<T>(params T[] p) where T : IComparable 
{ 
    T m1 = p[0]; 

    foreach (T v in p) 
    { 
     m1 = (m1.CompareTo(v) < 0) ? m1 : v; 
    } 

    return m1; 
} 

मैं सोचा था यह बहुत आसान होगा ले लो, लेकिन मैं मैं कैसे समझ में नहीं आता F # में एक चर तर्क तर्क निर्दिष्ट करेगा। मैं इस की कोशिश की है:

let rec Min l = 
    match l with 
    | [] -> 0 // should throw exception here 
    | [v] -> v 
    | (h::t) -> min h (Min t) 

लेकिन यह है कि सी # से फोन कर एक Microsoft.FSharp.Collections.List की उम्मीद है। क्या यह params T[] की अपेक्षा करना संभव है, और यदि हां, तो कैसे?

+0

इसके लायक होने के लिए, मैं इस तरह आपके फ़ंक्शन को फिर से लिखने की अनुशंसा करता हूं: न्यूनतम l = Seq.reduce min l – Juliet

+0

हाँ, बस इसे देखा गया है, अभी सेक विधियों के माध्यम से जा रहा है (पहली हिट गुना था, लेकिन कम वही है जो मैं ढूंढ रहा हूं) – Anteru

उत्तर

22

एक पैराम्स सरणी एक विशेषता के साथ बस एक सरणी है, जैसा कि जॉन नोट करता है। पैरामीटर से पहले विशेषता जोड़ें।

let test ([<ParamArray>] arr : 'a array) = 
    if arr.Length = 0 then invalid_arg "arr" 
    // .... 

आप प्रकार निर्दिष्ट करने की जरूरत नहीं है:

let test ([<ParamArray>] arr) = ... // lets type inference do its thing 

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

+2

हालांकि, एफ # में, पैरामीटर सरणी केवल विधियों में परिभाषित किया जा सकता है। उनका उपयोग मॉड्यूल में परिभाषित स्टैंडअलोन फ़ंक्शंस या फ़ंक्शंस में नहीं किया जा सकता है। http://msdn.microsoft.com/en-us/library/vstudio/dd233213.aspx तो परीक्षण करें ([] arr) दुर्भाग्य से –

+0

काम नहीं करता आपका क्या मतलब है, काम नहीं करता है? खुली प्रणाली;; परीक्षण करें ([] arr) =() ;; - बस ठीक है संकलित लगता है। – MichaelGG

+0

मॉड्यूल टेस्ट = \ N \ t जाने परीक्षण = \ N \ t \ t जाने परीक्षण '([] आगमन) =() \ n \ t \ t परीक्षण' \ N गुण पर अनुमति नहीं है 'चलो 'अभिव्यक्तियों में बाइंडिंग –

6

क्या आप इस विधि को एफ # या सी # से कॉल करना चाहते हैं? This hubFS post इंगित करता है कि F # कॉलिंग पक्ष पर पैरामीटर सरणी का समर्थन नहीं करता है, लेकिन मुझे संदेह है कि क्या आप इसे एक सरणी बनाने के लिए पैरामीटर के लिए सामान्य प्रकार की एनोटेशन का उपयोग करते हैं, और ParamArrayAttribute के साथ इसे सजाने के लिए भी, आपको इसे कॉल करने में सक्षम होना चाहिए सी # से परिवर्तनीय तर्क के साथ।

यह नहीं कह सकता कि मैंने देखा है कि एफ # में विशेषताओं के साथ पैरामीटर को कैसे सजाने के लिए है, लेकिन यदि आप चाहें तो मैं चारों ओर शिकार कर सकता हूं ... This blog post पैरामीटर स्तर पर नहीं बल्कि कुछ उदाहरण देता है।

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

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