2016-09-02 7 views
5

नीचे read_rest_of_csv पर ब्रांड्स की आवश्यकता क्यों है?इस F # फ़ंक्शन पर ब्रांड्स की आवश्यकता क्यों है?

let read_rest_of_csv() = 
     csv_data.Add(csv_fileH.ReadFields()) |> ignore 
     not csv_fileH.EndOfData 

    while read_rest_of_csv() do ignore None 

कोष्ठक के बिना, लूप समाप्त नहीं होगा।

open System 
open System.Threading 
open System.Collections.Generic 
open System.Linq 
open System.Text 
open System.Threading.Tasks 
open System.IO 
open Microsoft.VisualBasic.FileIO 

[<EntryPoint>] 
let main argv = 
    let csv_fileH = new TextFieldParser("test1.csv") 
    csv_fileH.TextFieldType = FieldType.Delimited |> ignore 
    let x = csv_fileH.SetDelimiters(",") 
    let csv_data = new List<string[]>() 

    let eod = csv_fileH.EndOfData 
    if not eod then 
     let column_headings = csv_fileH.ReadFields() 
     csv_data.Add(column_headings) |> ignore 

     let read_rest_of_csv = 
      csv_data.Add(csv_fileH.ReadFields()) |> ignore 
      not csv_fileH.EndOfData 

     while read_rest_of_csv do ignore None 

    0 

मैं क्षमा चाहता हूं कि मुझे याद नहीं आया कि मैंने यह कहां देखा था। मुझे लगता है कि यह एसओ में था। यह एक अच्छा उदाहरण है।

क्या यह हो सकता है कि माता-पिता के बिना मैं एक प्रकार की कार्य वस्तु से निपट रहा हूं?

मैं वास्तव में केवल एक सी, सी ++, और सी # पृष्ठभूमि से नहीं आ रहा हूं, बल्कि एक मध्यवर्ती क्लोजर पृष्ठभूमि भी आ रहा हूं। एफ # सिंटैक्स के साथ मेरे मामले में, मेरे हास्केल मैनुअल को थोड़ा और विस्तार से पढ़ने में मदद मिली हो सकती है, क्योंकि वाक्यविन्यास समान दिखते हैं।

उत्तर

18

ऐसा लगता है कि सी-पारिवारिक भाषाओं (सी #, जावा, सी, सी ++, जावास्क्रिप्ट) से आने वाले लोग एफ # में ब्रैकेट के उपयोग को समझने में समस्याएं हैं। मुझे निश्चित रूप से था, और मुझे कुछ साल लग गए कि चीजें कैसे काम करती हैं।

संक्षेप में, एफ # में सबसे बुनियादी बिल्डिंग ब्लॉक मान है।

let foo = bar 

इसका मतलब है कि foo एक मूल्य है, जो bar के बराबर होना होता है: मान let -bound हो सकता है।

// 'a -> 'a * 'a 
let f = fun x -> x, x 

यहाँ, f एक समारोह है कि कुछ मूल्य (x) लेता है और x के रूप में दोनों पहले और दूसरे तत्व के साथ एक टपल देता है:

कार्य भी मान रहे हैं।

कि लिखने के लिए एक सा बोझिल है, तो उसके लिए एक आशुलिपि है: इन भाव में कोई कोष्ठक देखते हैं

// 'a -> 'a * 'a 
let f x = x, x 

सूचना है कि।

कभी-कभी आपको ऑपरेटरों की प्राथमिकता को समायोजित करने की आवश्यकता होती है। गणित की तरह, 1 + 2 * 3 (जो 1 + (2 * 3) के बराबर है) (1 + 2) * 3 जैसा नहीं है। एफ # में, आप प्राथमिकता को ओवरराइड करने के लिए ब्रैकेट का भी उपयोग करते हैं। इस प्रकार

// 'a -> string * 'a 
let f x = someOtherFunction x, x 

नहीं

// x:'a -> string 
let f x = someOtherFunction (x, x) 

रूप में ही है (इस मामले में, someOtherFunction एक समारोह है कि एक string देता है।)

सूचना है कि कोष्ठक एक समारोह को निरूपित नहीं है कहते हैं; वे मूल्यांकन के आदेश को नियंत्रित करने के लिए केवल वहां हैं।

कभी-कभी, आप ऐसे फ़ंक्शन को परिभाषित करना चाहते हैं जो कोई इनपुट न ले। आप नहीं, हालांकि, यह इस तरह से परिभाषित कर सकते हैं:

let f = whatever 

क्योंकि है कि यह एक मूल्य तुरंत let -bound whatever करने के लिए है कि होगा। इसके बजाए, आप फ़ंक्शन को अंतर्निहित प्रकार unit का मान ले सकते हैं।

let f() = whatever 

इसका मतलब है कि f एक समारोह है कि पैटर्न unit का एकमात्र ज्ञात मूल्य के खिलाफ अपने इनपुट से मेल खाता है: इस प्रकार का केवल एक ही मूल्य है, जो () लिखा है है।

जब भी आप f() के साथ आते हैं, तो अभिव्यक्ति whatever का मूल्यांकन और लौटाया जाता है।

+0

आपने लोगों की प्रोग्रामिंग पृष्ठभूमि F # पर आने के बारे में एक अच्छा मुद्दा बनाया है। इसलिए, मैंने अपनी पृष्ठभूमि को इंगित करने के लिए ओपी में कुछ और जोड़ा। जिस हिस्से को मैं उपयोग करने जा रहा हूं वह यूनिट,(), और उन बाइंडिंग जैसी चीजें हैं। – octopusgrabbus

5

कोष्ठक के बिना, सामग्री एक बार निष्पादित होती है और कभी नहीं। read_rest_of_csv में bool का एक प्रकार है: आप मूल रूप से while true do ignore None कह रहे हैं।

कोष्ठक इंगित करते हैं कि read_rest_of_csv में unit -> bool टाइप है, इसलिए हर बार जब आप इसे आमंत्रित करते हैं, तो यह एक पंक्ति पढ़ता है और कर्सर को ले जाता है। अन्यथा, यह केवल एक बार ऐसा करेगा।

let read_rest_of_csv = 
    csv_data.Add(csv_fileH.ReadFields()) |> ignore 
    not csv_fileH.EndOfData 

एक समारोह बिल्कुल नहीं है:

+0

क्या मैंने माता-पिता के बजाय ब्रैकेट का उपयोग किया हो सकता है? – octopusgrabbus

+0

"ब्रैकेट" के लिए, "कोष्ठक" पढ़ें। मैं अपना जवाब संपादित करूंगा (बच्चों के साथ नहीं, मुझे डर है)। –

+0

धन्यवाद RobLyndon – octopusgrabbus

3

अपने प्रश्न का उत्तर है। यह इससे अलग नहीं है:

> let i = 1;; 

val i : int = 1 

यह एक पूर्णांक मान के साथ बाध्यकारी घोषित करता है। आप एक समारोह मूल्य जो कोई पैरामीटर लेता है के साथ एक बाध्यकारी घोषित करने के लिए चाहते हैं, कि इस तरह दिखता है:

> let i() = 1;; 

val i : unit -> int 

ठीक उसी तर्क read_rest_of_csv पर लागू होता है। कंस्ट्रैसिस के बिना, आप bool टाइप के साथ बाध्यकारी घोषित कर रहे हैं। कोष्ठक के साथ, आप unit->bool टाइपिंग के साथ बाध्यकारी घोषित कर रहे हैं यानी एक फ़ंक्शन वैल्यू के साथ बाध्यकारी जहां फ़ंक्शन कोई इनपुट नहीं लेता है और एक बूल मान देता है।

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