2008-08-30 12 views
18

स्टैक ओवरव्लो में ऐसा लगता है कि F # उत्साही समूह का एक समूह है।एफ # भाषा - नौसिखिया के लिए संकेत

मैं इस भाषा को बेहतर जानना चाहता हूं, इसलिए functional programming theory के अलावा, क्या आप मुझे F # भाषा का उपयोग शुरू करने के लिए बेहतर प्रारंभिक बिंदुओं पर इंगित कर सकते हैं? मेरा मतलब है, ट्यूटोरियल, कैसे करें, लेकिन सभी काम करने वाले नमूनों में से कुछ को कुछ करने और भाषा का आनंद लेने का मौका मिला है।

धन्यवाद एक बहुत

एंड्रिया

उत्तर

30

अपने आप को बुरी नहीं वेश्या लेकिन मैं अपने ब्लॉग here और here पर एक जोड़े को एफ # सिंहावलोकन पदों लिखा था। क्रिस स्मिथ (एमएस में एफ # टीम के लड़के) में 'एफ # में 20 मिनट' नामक एक लेख है - part 1 और part 2

नोट आपको सावधान रहना होगा क्योंकि एफ # (संस्करण 1.9.6.0) के नवीनतम सीटीपी ने पिछले संस्करणों की तुलना में कुछ गंभीरता से बदलाव तोड़ दिए हैं, इसलिए वहां कुछ उदाहरण/ट्यूटोरियल संशोधन के बिना काम नहीं कर सकते हैं।

यहाँ कुछ शांत सामान की एक त्वरित विवरण दिया गया है, हो सकता है मैं तुम्हें कुछ संकेत यहाँ अपने आप को दे सकते हैं जो स्पष्ट रूप से बहुत संक्षिप्त और शायद महान नहीं हैं, लेकिन उम्मीद है कि आप कुछ के साथ खेलने के लिए देता है: -

पहला नोट - इंटरनेट पर अधिकांश उदाहरण 'हल्के सिंटैक्स' को चालू करेंगे। इस प्रयोग में निम्न कोड पंक्ति को प्राप्त करने के लिए: -

#light 

यह कुछ कीवर्ड को OCaml संगतता के लिए मौजूद हैं और भी अर्धविराम से प्रत्येक पंक्ति को समाप्त करने के लिए होने को सम्मिलित करने के लिए होने से रोकता है। ध्यान दें कि इस वाक्यविन्यास का अर्थ है इंडेंटेशन स्कोप को परिभाषित करता है। बाद के उदाहरणों में यह स्पष्ट हो जाएगा, जिनमें से सभी हल्के सिंटैक्स पर भरोसा करते हैं।

आप उदाहरण के लिए, डबल अर्द्ध कोलन के साथ सभी बयानों को समाप्त करने के इंटरैक्टिव मोड आप उपयोग कर रहे हैं: -

> #light;; 
    > let f x y = x + y;; 

    val f : int -> int -> int 

    > f 1 2;; 
    val it : int = 3 

ध्यान दें कि इंटरैक्टिव मोड प्रत्येक पंक्ति के बाद एक 'वैल' परिणाम देता है। यह परिभाषाओं के बारे में महत्वपूर्ण जानकारी देता है जो हम बना रहे हैं, उदाहरण के लिए 'वैल एफ: int -> int -> int' इंगित करता है कि एक फ़ंक्शन जो दो इंच लेता है, एक int देता है।

ध्यान दें कि केवल इंटरैक्टिव में हम, अर्द्ध कोलन के साथ लाइनों को समाप्त करने की आवश्यकता है जब वास्तव में एफ # कोड को परिभाषित हम चाहते हैं कि :-)

से मुक्त होते हैं आप 'जाने' कीवर्ड का उपयोग कर कार्यों को परिभाषित। यह शायद एफ # में सबसे महत्वपूर्ण कीवर्ड है और आप इसका बहुत उपयोग करेंगे। उदाहरण के लिए: -: आप कर सकते हैं या तो अलग मानकों खाली स्थान के द्वारा या 'tuples में पैरामीटर निर्दिष्ट -

sumStuff 1 2 
3 
sumStuffTuple (1, 2) 
3 

नोट यहां कार्यों को परिभाषित करने के दो अलग-अलग तरीके हैं -

let sumStuff x y = x + y 
let sumStuffTuple (x, y) = x + y 

हम इन कार्यों इस प्रकार कॉल कर सकते हैं '(यानी अल्पविरामों द्वारा अलग किए गए कोष्ठक में मूल्य)। अंतर यह है कि हम उन कार्यों को प्राप्त करने के लिए 'आंशिक फ़ंक्शन एप्लिकेशन' का उपयोग कर सकते हैं जो पहले दृष्टिकोण का उपयोग करके आवश्यक पैरामीटर से कम लेते हैं, न कि दूसरे के साथ। E.g.:

let sumStuff1 = sumStuff 1 
sumStuff 2 
3 

नोट हम अभिव्यक्ति 'sumStuff 1' से एक फ़ंक्शन प्राप्त कर रहे हैं। जब हम 'प्रथम श्रेणी के कार्यों' वाले भाषा के रूप में संदर्भित डेटा के रूप में आसानी से कार्य कर सकते हैं, यह किसी भी कार्यात्मक भाषा का मूलभूत हिस्सा है जैसे कि F #।

पैटर्न मिलान बहुत अच्छा ठंडा है, यह मूल रूप से स्टेरॉयड पर स्विच स्टेटमेंट की तरह है (हाँ मैंने उस वाक्यांश को किसी अन्य F # -ist :-) से हटा दिया है। जब हम कुछ लेकिन अभिव्यक्ति हम लौट रहे हैं इनपुट पर निर्भर नहीं करता पर मिलान करना चाहते

let someThing x = 
    match x with 
    | 0 -> "zero" 
    | 1 -> "one" 
    | 2 -> "two" 
    | x when x < 0 -> "negative = " + x.ToString() 
    | _ when x%2 = 0 -> "greater than two but even" 
    | _ -> "greater than two but odd" 

नोट हम '_' प्रतीक का उपयोग -: आप की तरह सामान कर सकते हैं।

हम पद्धति का उपयोग कर मिलान करता है, तो, elif, और बयानों को संक्षिप्त कर सकते हैं के रूप में आवश्यक: -

let negEvenOdd x = if x < 0 then "neg" elif x % 2 = 0 then "even" else "odd" 

एफ # सूची (जो जुड़ा हुआ सूचियों के नीचे के रूप में लागू किया जाता है) इस प्रकार हेरफेर किया जा सकता: -

let l1 = [1;2;3] 
l1.[0] 
1 

let l2 = [1 .. 10] 
List.length l2 
10 

let squares = [for i in 1..10 -> i * i] 
squares 
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100] 

let square x = x * x;; 
let squares2 = List.map square [1..10] 
squares2 
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100] 

let evenSquares = List.filter (fun x -> x % 2 = 0) squares 
evenSqares 
[4; 16; 36; 64; 100] 

सूची.मैप फ़ंक्शन 'मानचित्र' को 1 से 10 तक सूची में स्क्वायर फ़ंक्शन पर ध्यान दें, यानी प्रत्येक तत्व को फ़ंक्शन लागू करता है। List.filter 'फ़िल्टर' को केवल सूची में मूल्यों को लौटकर एक सूची 'फ़िल्टर करता है जो प्रदान किए गए अनुमानित फ़ंक्शन को पास करता है। 'मजेदार एक्स -> एफ' वाक्यविन्यास भी ध्यान दें - यह एफ # लैम्ब्डा है।

ध्यान दें कि हमने किसी भी प्रकार को परिभाषित नहीं किया है - एफ # कंपाइलर/दुभाषिया 'infers' प्रकार, यानी आप जो काम करना चाहते हैं उसे बाहर कर सकते हैं। उदाहरण के लिए: -

let f x = "hi " + x 

यहाँ संकलक/दुभाषिया एक्स का निर्धारण करेगा जब से तुम एक ऑपरेशन जो एक्स की आवश्यकता है एक स्ट्रिंग होना करने के लिए प्रदर्शन कर रहे हैं एक श्रृंखला है। यह भी निर्धारित करता है कि रिटर्न प्रकार स्ट्रिंग भी होगा।

संकलक, धारणाएं बनाता है जब अस्पष्टता नहीं है, उदाहरण के लिए: -

let f x y = x + y 

यहाँ x और y प्रकार के एक नंबर हो सकता है, लेकिन संकलक चूक int करने के लिए।क्या आप प्रकार एनोटेशन का उपयोग कर सकते हैं प्रकार निर्धारित करना चाहते हैं: - यह भी ध्यान रखें कि हम एक्स संलग्न करना पड़ा है

let f (x:string) y = x + y 

: कोष्ठक में स्ट्रिंग, हम अक्सर एक समारोह परिभाषा के अलग अलग हिस्सों को यह करना है।

एफ # में दो वास्तव में उपयोगी और भारी उपयोग किए जाने वाले ऑपरेटरों पाइप आगे और फ़ंक्शन संरचना ऑपरेटर |> और >> क्रमशः हैं। -

let (|>) x f = f x 

ध्यान दें कि आप एफ # में ऑपरेटरों को परिभाषित कर सकते हैं, यह बहुत अच्छा :-) है:> इस प्रकार |

हम परिभाषित करते हैं।

यह आपको एक स्पष्ट तरीके से काम लिखने के लिए, e.g.:-

[1..10] |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0) 

आप पहले 10 भी चौराहों प्राप्त करने के लिए अनुमति देते हैं जाएगा अनुमति देता है। यही कारण है कि स्पष्ट है की तुलना में: -

List.filter (fun x -> x % 2 = 0) (List.map (fun x -> x * x) [1..10]) 

ठीक है, कम से कम मुझे लगता है कि इतना :-) इस प्रकार

समारोह संरचना द्वारा >> ऑपरेटर परिभाषित परिभाषित किया गया है: -

let (>>) f g x = g(f(x)) 

अर्थात आप एक ऑपरेशन को अग्रेषित करते हैं केवल पहले फ़ंक्शन का पैरामीटर अनिर्दिष्ट रहता है। के रूप में आप निम्न कर सकते हैं तो यह उपयोगी है: -

let mapFilter = List.map (fun x -> x * x) >> List.filter (fun x -> x % 2 = 0) 

यहाँ mapFilter एक सूची एक इनपुट स्वीकार करते हैं और सूची से पहले के रूप में फ़िल्टर वापस आ जाएगी। यह का एक संक्षिप्त संस्करण है: -

let mapFilter = l |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0) 

हम पुनरावर्ती कार्यों हम बाद 'आरईसी' रखकर पुनरावर्ती के रूप में समारोह को परिभाषित करने के लिए है लिखने के लिए चाहते हैं। नीचे उदाहरण।

कुछ शांत सामान: -

क्रमगुणित

let rec fact x = if x <= 1 then 1 else x * fact (x-1) 

वें फाइबोनैचि संख्या

let rec fib n = if n <= 1 then n else fib (n-1) + fib (n-2) 

FizzBuzz

let (/%) x y = x % y = 0 
let fb = function 
    | x when x /% 15 -> "FizzBuzz" 
    | x when x /% 3 -> "Fizz" 
    | x when x /% 5 -> "Buzz" 
    | x    -> x.ToString() 

[1..100] |> List.map (fb >> printfn "%s") 

वैसे भी एक बहुत छोटा सा अवलोकन है कि, उम्मीद है कि यह एक छोटे में मदद करता है !!

5

संदेह के बिना, आपको डॉन सिमे की उत्कृष्ट पुस्तक "विशेषज्ञ एफ #" खरीदनी चाहिए। पुस्तक बहुत अच्छी तरह से लिखी गई है और दोनों शुरुआती और विशेषज्ञों के लिए उपयुक्त है। इसमें, आप दोनों प्रारंभिक सामग्री और अधिक चुनौतीपूर्ण सामग्री भी पाएंगे। लगभग 600 पृष्ठों पर यह पैसे के लिए अच्छा मूल्य है।

मैंने पाया कि यह मुझे अधिक कार्यात्मक सी # लिखने के साथ-साथ विंडोज होस्टेड एफ # अनुप्रयोगों को लिखना शुरू करने के लिए आवश्यक सभी संदर्भ सामग्री प्रदान करने के लिए बहुत उपयोगी तकनीक सिखाता है।

पुस्तक अप्रेस द्वारा प्रकाशित और पर एक साथ वेब साइट है: http://www.expert-fsharp.com/default.aspx

5

@ क्रोनोज़ - आपके लंबे उत्तर के लिए बहुत बहुत धन्यवाद, यह शुरू करने के लिए वास्तव में एक अच्छी जगह है। मैं आपकी सलाह का पालन करूंगा, और @vecstasy पुस्तक का उल्लेख करूंगा।

अब, मुझे कोडिंग :-) जाने

let thanksalot = "thanks a lot" 
printfn "%s" (thanksalot);; 
+0

धन्यवाद कोड के कारण पूरी तरह से ऊपर उठाया गया। हू-yah! – AruniRC

1

आप दृश्य स्टूडियो में वर्तमान सीटीपी रिहाई तो यह आपको एक एफ # ट्यूटोरियल परियोजना है, जिसमें आप एक Tutorial.fs देता बनाने की सुविधा देता है, बिल्कुल युक्त है, तो क्या इसका नाम सुझाता है।

यह ट्यूटोरियल भी F# examples at Microsoft के बड़े संग्रह को इंगित करता है।

इसके अलावा, CodePlex पर एक एफ # नमूने प्रोजेक्ट चल रहा है।

आशा इस मदद करता है,

Michiel

2

मैं Real World Functional Programming

पढ़ने किया गया है द्वारा एफ # और सी # में उदाहरण के साथ: टॉमस Petricek

अब तक मैं शिक्षण में यह बहुत अच्छा लगता है पक्ष में # सी में कार्यान्वयन दिखाकर एफ # अवधारणाएं। ओओ प्रोग्रामर के लिए बढ़िया।

1

वैज्ञानिकों के लिए मेरी पुस्तक एफ # का पहला अध्याय स्वतंत्र रूप से here उपलब्ध है। हमारे पास मुफ्त एफ # खिलौने कार्यक्रमों की एक श्रृंखला है here। हमारे एफ # .NET जर्नल का पहला आलेख स्वतंत्र रूप से here उपलब्ध है।

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