เริ่มต้นเขียน F#

เริ่มต้น F#

ก่อนจะสนุกลง Virtual Studio 2010 ก่อน (หวังว่ามีกันทุกคน) 

ไป load FunPad เครื่องมือไว้เล่นกับตัวอย่างที่ผมจะใช้อธิบาย และคุณลองทำ ได้ที่นี่  http://funpad.codeplex.com/

พอ load มาเสร็จก็ แตก rar ออก เข้าไป double click FunPad.exe เพื่อเปิด FunPad ขึ้นมา

เอาละเรามาเริ่ม Application แรกกันเลยดีกว่า นั่นก็คือ Hello F# World!

ที่ FunPad ที่เปิดอยู่พิมพ์คำสั่งนี้ลงไป

printfn “Hello F# World!”;;

กด Enter เพื่อ execute คำสั่ง ผลลัพย์ ที่ได้คือ

Hello F# World!
val it : unit = ()

สำเร็จแล้ว ยินดีด้วยนะครับ คุณเขียน F# เป็นแล้ว

ต่อไปก็ทำความเข้าจาก Sample101 load มาศึกษาเองได้เลยที่นี่ http://code.msdn.microsoft.com/F-Samples-101-0576cb9f

————————————– ส่วนนี้ถ้ามีเวลาจะเข้ามาเติมเรือยๆ ————————————–

Introduction กับ F# 2.0…

//นิยามตัวแปล x1, x2 เป็น integer มีค่าเท่ากับ 1 และ 2 ตามลำดับ

let x1, x2 = 1, 2

//ให้ x3 เท่ากับ x1 + x2 แล้ว print ออกมาที่หน้าจอ

let x3 = x1 + x2

printfn “x1 + x2 = %d” x3

ขึ้นบรรทัดใหม่แล้วใส่เครื่องหมาย ;; กด enter จะเป็นการ excute คำสั่ง F# ทั้งหมด ผลที่ออกมาจะได้เป็น

x1 + x2 = 3

//การประกาศ Function ง่ายๆ ชื่อว่า f โดย input เป็น x และ retrun เป็น 2 * x * x – 5 * x + 3

let f x = 2*x*x – 5*x + 3;;

//ลองเรียก function f โดยใส่ 10 เข้าไป

printfn “f(10) = %d” (f 10);;

//สร้าง function facto แบบ recursive หาค่า factorial เช่น 10! = 10*9*8*…*1*0!  และนิยาม 0! = 1 รูปทั่วไปก็คือ n! = n*(n-1)*(n-2)*…*1

let rec facto n = if n=0 then 1 else n * facto(n-1);;

//ลองทดสอบ recursive function factorial ดู

printfn “facto(10) = %d” (facto 10);;

//สร้าง recursive function  ที่ซับซ้อนขึ้นมาหน่อย เป็น function หาค่าผลหารลงตัว ที่มากที่สุด

let rec hcf a b = //highest-common-factor

       if a=0 then b //คำแนะนำ ให้ Enter 7 ครั้งแทนการกด Tab ครับ

       elif a<b then hcf a (b-a)

       else hcf (a-b) b;;

//ทดสอบ hcf

printfn “hcf(150, 500) = %d” (hcf 150 500);;

//กำหนด Tuple 2 มิติ และสร้าง function distance ที่ input Tuple 2 มิติลงไป

let p1 = (0.0, 0.0) // เมื่อเติม #.0 เข้าไป จะทำให้ค่านี้มี type เป็น float ทันที

let p2 = (5.0, 5.0)

let distance (x1, y1) (x2, y2) = 

       let dX = System.Math.Pow(x1-x2, 2.0)

       let dY = System.Math.Pow(y1-y2, 2.0)

       System.Math.Sqrt(dX+dY)

printfn “distance from %A to %A = %g” p1 p2 (distance p1 p2)

;;//กด Enter

//เล่นกับ Boolean

let boolean1 = true

let boolean2 = false

let boolean3 = not boolean1 && (boolean2 || false)

printfn “~%b and (%b or false) = %b” boolean1 boolean2 boolean3

;;

//เล่นกับ String

let stringA  = “Hello”

let stringB  = “world”

let stringC  = stringA + ” ” + stringB

printfn “%s + %s = %s” stringA stringB stringC;;

//เล่นกับ List

let list1 = [1, 2, 3, 4, 5]

let list2 = [1..5] // ได้ค่าเหมือน list1 แต่เขียนต่อ

let list3 = [1..2..20] //ได้ list ที่มีค่า 1, 3, 5, … , 19 หรือเริ่มจากค่า 1 บวกไปทีละ 2 ไปเรื่อยๆ แต่ไม่มากกว่า 20

let list4 = [ for x in 0..10 -> x*x ] //สร้าง List ที่ยกกำลัง 2 จาก 0 ถึง 10

let rec sumList xs = //สร้าง function ผลรวมง่ายๆเพื่อเล่นกับ Liat

        match xs with

        | []    -> 0

        | y::ys -> y + sumList ys

//Print ผลลัพย์ ทดสอบ function sumList กับ list1, list2, list3 และ list4

printfn “sumList(list1): %d, sumList(list2): %d, sumList(list3): %d, sumList(list4): %d” (sumList list1)(sumList list2)(sumList list3)(sumList list4);;

//เล่นกับ การ transfrom List ต่อคือการ Map ขนาดไม่เปลี่ยนแต่ข้อมูลเปลี่ยน รับ Func คือ input -> sigle output, 

let square x = x*x //สร้าง function ยกกำลังง่ายๆ

let squares1 = List.map square [1; 2; 3; 4] //squares1 เป็นค่า list 1, 2, 3 และ 4 ที่ถูก map แล้ว โดยผ่าน function square จึงมีค่าออกมาเป็น 1, 4, 9, 16

let squares2 = List.map (fun x -> x*x) [1; 2; 3; 4] //เหมือนกับ squares1 แต่เขียน โดยประกาศ function อีกแบบหนึ่ง ซึ่ง fun x -> x*x ทำงานได้เหมือน square นั่นเอง

let squares3 = [1; 2; 3; 4] |> List.map (fun x -> x*x) //เหมือนกันแต่ใช่สัษลักที่เรียกว่า Pipelines ( |> )

//อะเรามาดู Pipelines กันอีกตัวอย่าง

let sumOfSquaresUpTo n = [1..n] |> List.map square |> List.sum //อ่านจากซ้ายไปขวาคือ function sumOfSquaresUpTo รับ Input n สร้าง List 1 ถึง n เข้า Pipelines ไปยัง List.map และคำนวณด้วย func square 

//ก็จะได้ List 1 ถึง n ที่ยกกำลังสอง หลังจากนั้นก็ เข้าไปที่ Pipelines ไปยัง List.sum ต่อซึ่งคือผลรวมของ square list นั่นเอง

 ————————————–

เอาแค่นี้ละกันครับ F# ยังมีอะไรๆที่สนุกๆเยอะมาก…

แหล่งทรัพยากรความรู้

Advertisements

#f