سؤال

يبدو هنا في StackOveflow هناك مجموعة من F# هواة.

أود أن أعرف أفضل هذه اللغة ، وذلك بصرف النظر عن البرمجة الوظيفية نظرية, هل يمكنك أن ترشدني إلى أفضل نقطة انطلاق لبدء استخدام F# اللغة ؟ أعني, الدروس, how-tos, ولكن أولا وقبل كل شيء العمل عينات لديك فرصة أن تبدأ في فعل شيء والتمتع اللغة.

شكرا جزيلا

أندريا

هل كانت مفيدة؟

المحلول

لا عاهرة نفسي فظيعة ولكن كتبت بضع F# نظرة عامة على وظيفة في بلدي بلوق هنا و هنا.كريس سميث (الرجل على F# فريق في MS) له مقالا بعنوان 'F# في 20 دقيقة - الجزء 1 و الجزء 2.

ملاحظة: عليك أن تكون حذرا كما أحدث CTP F# (الإصدار 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

علما بأن الوضع التفاعلي بإرجاع 'فال' النتيجة بعد كل سطر.وهذا يعطي معلومات هامة عن التعاريف نحن صنع, على سبيل المثال 'فال f :الباحث -> int -> int' يشير إلى أن وظيفة يأخذ اثنين رجات يعود الباحث.

علما بأن فقط في التفاعلية هل نحن بحاجة إلى إنهاء خطوط مع منقوطة ، عندما في الواقع تحديد F# رمز ونحن أحرار في أن :-)

يمكنك تحديد المهام باستخدام 'السماح' الكلمة.هذا هو ربما الأكثر أهمية الكلمة في كل من F# و سوف تستخدم ذلك كثيرا.على سبيل المثال:-

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

يمكننا أن نطلق على هذه الوظائف على النحو التالي:-

sumStuff 1 2
3
sumStuffTuple (1, 2)
3

ملاحظة: هناك نوعان من طرق مختلفة لتحديد الوظائف هنا - يمكنك إما منفصلة معايير بيضاء أو تحديد المعلمات في الصفوف' (أيالقيم بين قوسين مفصولة بفواصل).الفرق هو أن نتمكن من استخدام 'جزئية وظيفة التطبيق' للحصول على الوظائف التي تأخذ أقل من المعلمات المطلوبة باستخدام النهج الأول وليس الثاني.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"

ملاحظة نستخدم '_' الرمز عندما نريد أن المباراة على شيء ولكن التعبير نعود لا تعتمد على المدخلات.

يمكننا اختصار مطابقة نمط استخدام إذا, أليف, و آخر البيانات المطلوبة:-

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

F# القوائم (التي يتم تنفيذها في القوائم المرتبطة تحت) يمكن التلاعب بها على النحو التالي:-

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 ، أيينطبق وظيفة كل عنصر.قائمة.تصفية 'فلاتر' قائمة إلا بالعودة القيم في القائمة التي تمر المسند وظيفة المقدمة.نلاحظ أيضا 'متعة x -> f' بناء الجملة - وهذا هو F# امدا.

علما بأن جميع أنحاء لدينا لم تعرف أي أنواع - F# مترجم/مترجم 'يستنتج أنواع ، أييعمل بها ما تريد من الاستخدام.على سبيل المثال:-

let f x = "hi " + x

هنا مترجم/مترجم ستحدد x هو سلسلة منذ كنت أداء العملية التي يتطلب x إلى سلسلة.كما يحدد نوع الإرجاع سوف تكون السلسلة أيضا.

عندما يكون هناك غموض مترجم يجعل الافتراضات ، على سبيل المثال:-

let f x y = x + y

هنا x و y يمكن أن يكون هناك عدد من أنواع ولكن المترجم التخلف إلى int.إذا كنت ترغب في تحديد أنواع يمكنك استخدام نوع الشرح:-

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

نلاحظ أيضا أن علينا أن أرفق x:سلسلة بين قوسين ، ونحن في كثير من الأحيان إلى القيام بذلك إلى أجزاء منفصلة من وظيفة التعريف.

اثنين من المفيد حقا و المستخدمة بكثرة منظم و# هي الأنابيب إلى الأمام وظيفة تكوين شركات |> و >> على التوالي.

نحدد |> وهكذا:-

let (|>) x f = f x

لاحظ أنه يمكنك تحديد منظم و# هذا هو بارد جدا :-).

هذا يسمح لك أن تكتب الأشياء بطريقة أوضح ، على سبيل المثال:-

[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)

إذا أردنا كتابة وظائف العودية علينا أن نحدد وظيفة العودية من خلال وضع rec بعد السماح.الأمثلة أدناه.

بعض الاشياء باردة:-

مضروب

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")

على كل حال هذا جدا لمحة موجزة, نأمل أن يساعد قليلا!!

نصائح أخرى

دون شك, يجب عليك شراء لا سايم ممتازة كتاب "الخبراء F#".الكتاب هو مكتوب بشكل جيد جدا و مناسب للمبتدئين و الخبراء على حد سواء.في ذلك سوف تجد كل تمهيدية مادة و أكثر من ذلك بكثير تحدي المواد أيضا.في ما يقرب من 600 صفحة هي قيمة جيدة مقابل المال.

لقد وجدت أنه علمني الكثير من التقنيات المفيدة في كتابة أكثر وظيفية C# وكذلك توفير جميع المواد المرجعية كنت بحاجة للبدء في كتابة ويندوز استضافت F# التطبيقات.

الكتاب نشرته Apress وقد المصاحب موقع ويب في:http://www.expert-fsharp.com/default.aspx

@kronoz - حسنا شكرا جزيلا لك إجابة طويلة ، هذا هو مكان جيد لبدء من.سوف اتبع النصائح الخاصة بك ، والبحث عن الكتاب @vecstasy المذكورة.

الآن, اسمحوا لي أن أذهب الترميز :-)

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

لقد تم قراءة العالم الحقيقي البرمجة الوظيفية

مع أمثلة و# و C# من:توماس Petricek

حتى الآن أجد أنه جيد جدا في التدريس و# المفاهيم من خلال عرض تطبيقات في C# على الجانب.كبيرة بالنسبة OO المبرمجين.

تحقق من F# مركز المطور.هناك أيضا hubFS, منتدى مخصص F#.

إذا كان لديك CTP الحالي في Visual Studio فإنه يتيح لك إنشاء و# البرنامج التعليمي المشروع الذي يتيح لك البرنامج التعليمي.fs بالضبط تتضمن ما يوحي اسمها.

هذا البرنامج التعليمي يشير أيضا إلى مجموعة كبيرة من F# الأمثلة في مايكروسوفت.

أيضا هناك و# عينات المشروع في CodePlex.

ويساعد هذا الأمل ،

ميشيل

الفصل الأول من كتابي F# للعلماء هي متاحة بحرية هنا.لدينا سلسلة من الحر و# لعبة البرامج هنا.المادة الأولى من F#.NET مجلة هي متاحة بحرية هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top