अपने आप को बुरी नहीं वेश्या लेकिन मैं अपने ब्लॉग 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")
वैसे भी एक बहुत छोटा सा अवलोकन है कि, उम्मीद है कि यह एक छोटे में मदद करता है !!
धन्यवाद कोड के कारण पूरी तरह से ऊपर उठाया गया। हू-yah! – AruniRC