Functional Language

Download Report

Transcript Functional Language

1
FUNCTIONAL
PROGRAMMING
การโปรแกรมเชิงหน้าที่
การทาโปรแกรมเชิงคาสัง่
(procedural programming)
2




เป็ นวิธกี ารสังงานคอมพิ
่
วเตอร์ทไ่ี ด้รบั อิทธิพลจาก Von Neumann machine ทีม่ ี
ส่วนประกอบหลักคือ memory และ cpu
Memory ทาหน้าทีเ่ ก็บชุดคาสังและข้
่
อมูล ขณะที่ cpu ทาหน้าทีป่ ระมวลผล
ตัวอย่างข้อความสังก
่ าหนดค่า
Program Modulo
(1) read M1
(2) read M2
(3) M1 = M1 – M2
(4) If M1 >= 0 then goto (3)
(5) M1 = M1 + M2
(6) write M1
(7) halt
ข้อความสังก
่ าหนดค่า …………………….จะทาให้สถานะของคอมพิวเตอร์เปลีย่ นแปลง
โดยพิจารณาจากค่าทีเ่ ก็บอยูใ่ นหน่วยความจา
3
การทาโปรแกรมเชิงคาสัง่
(procedural programming)
4



การทาโปรแกรมเชิงคาสัง่ เป็ นวิธีการทาโปรแกรมที่ใช้คำสัง่ กำหนดค่ำเป็ น
หลักในกำรควบคุมกำรทำงำน โดยมีคาสัง่ อื่นประกอบในการกาหนดลาดับ
การทางาน เช่น คาสัง่ วนซ้า คาสัง่ เงื่อนไข
กำรเขียนโปรแกรมมีแนวคิดเกี่ยวกับกำรเปลี่ยนสถำนะ (เปลี่ยนค่ำใน
หน่ วยควำมจำ) ของเครื่องคอมพิวเตอร์ไปตามลาดับ จนกระทัง่ ได้ผลลัพธ์
สุดท้ายที่ตอ้ งการ
ถือได้วา่ ลักษณะทางฮาร์ดแวร์มีผลต่อแนวคิดการเขียนโปรแกรม
การทาโปรแกรมแบบไร้กระบวนคาสัง่
(non-procedural programming)
5



การทาโปรแกรมแบบไร้กระบวนคาสัง่ เป็ นลักษณะของวิธีการทาโปรแกรมที่
ถูกออกแบบมาเพื่อลดอิทธิพลแนวคิดการทางานของเครื่องคอมพิวเตอร์ที่มี
ผลต่อการเขียนโปรแกรม เพื่อให้การเขียนโปรแกรมเป็ นอิสระจากฮาร์ดแวร์
ภาษาในกลุ่มไร้กระบวนคาสัง่ ประกอบด้วย ……………………..
……………………..
ภาษาเชิงหน้าที่ ใช้ฟังก์ชนั ที่คล้ายกับฟั งก์ชนั ทางคณิตศาสตร์เป็ น
ส่วนประกอบหลักของโปรแกรม เป็ นการเชื่อมโยงค่าจากข้อมูลเข้าไปยัง
ผลลัพธ์ที่จะเกิดขึ้ น โดยไม่ตอ้ งระบุข้นั ตอนการเปลี่ยนแปลงสถานะภายใน
ของคอมพิวเตอร์
หลักการทาโปรแกรมเชิงหน้าที่
6
มีส่วนประกอบสาคัญ 3 ส่วน คือ
 ส่วนโครงสร้างข้อมูลพื้ นฐาน ได้แก่ โครงสร้างข้อมูลเชิงรายการ หรือ ลิสต์
(list) เพื่อใช้เก็บข้อมูลประเภทต่าง
 ส่วนของฟั งก์ชน
ั พื้ นฐานเพื่อทางานกับลิสต์ เช่น ฟั งก์ชนั ในการสร้างลิสต์
ฟั งก์ชนั เรียกใช้ขอ้ มูลจากลิสต์
 ส่วนโครงสร้างที่ชว
่ ยสร้างฟั งก์ชนั จากฟั งก์ชนั ที่มีอยู่ เรียกว่าฟั งก์ชนั อันดับสูง
(higher-order function)
หลักการทาโปรแกรมเชิงหน้าที่
7


โปรแกรมเชิงหน้าที่เป็ นโปรแกรมที่ประกอบด้วยฟั งก์ชนั ซึ่งนิ ยามขึ้ นจาก
นิ พจน์ (expression) โดยอาจเป็ นนิ พจน์เดี่ยวๆ หรือประกอบขึ้ นจากนิ พจน์
ย่อยอื่นๆ หรือเป็ นนิ พจน์แบบมีเงื่อนไข ส่วนประกอบของฟั งก์ชนั จะมีเพียง
นิ พจน์ โดยไม่มีขอ้ ควำมสัง่ (statement)
เมื่อต้องการทางานซ้า การทาโปรแกรมเชิงหน้าที่จะใช้วธิ ีสร้างฟั งก์ชนั เวียน
บังเกิด (recursive function) คือฟั งก์ชนั ที่เรียกตัวเองซ้า
เปรียบเทียบการทาโปรแกรมเชิงคาสัง่ และเชิงหน้าที่
8


สังเกต (a) เมื่อประกาศฟั งก์ชนั fact() ส่วน body ของฟั งก์ชนั คือข้อความสัง่
ต่างๆ ที่อยูภ่ ายใน {…}
สังเกต (b) เมื่อประกาศฟั งก์ชนั fact() ส่วน body คือส่วนที่อยูข่ วามือของ
เครื่องหมายเท่ากับ ซึ่งมีลกั ษณะเป็ นนิ พจน์ ไม่ใช่ขอ้ ความสัง่
เปรียบเทียบการทาโปรแกรมเชิงคาสัง่ และเชิงหน้าที่
9

เมื่อเรียกใช้ fact (3) ขั้นตอนแรกคือเชื่อมโยงค่า 3 เข้ากับชื่อ n ใน
โปรแกรม ขั้นต่อมาคือเรียกใช้ฟังก์ชนั ที่ n มีค่าเป็ น 3 เช่นนี้ ไปเรื่อยๆ

จะเห็นได้วา่ n จะเป็ นเพียงชื่อที่ถกู สร้างไว้รอการเชื่อมโยงกับค่าที่จะเกิดขึ้ น
จริงเมื่อมีการเรียกใช้ฟังก์ชนั และเมื่อถูกเชื่อมโยงแล้ว ค่า n จะมีค่าเป็ น 3
และตัวแปรจะคงค่านั้นไปตลอดฟั งก์ชนั ภำษำเชิงหน้ำที่จึงไม่จำเป็ นต้องมี
คำสัง่ กำหนดค่ำ เพรำะตัวแปรจะรับค่ำเมื่อฟั งก์ชนั ถูกเรียกใช้และจะไม่ถกู
เปลี่ยนแปลงค่ำอีก เรียกว่ำ ภำษำเชิงหน้ำที่แท้ (pure function langage)
ฟั งก์ชนั
10



ฟั งก์ชนั คือการเชือ่ มโยงข้อมูลจากเซตของโดเมนไปยังข้อมูลในเซตของเรนจ์
(หรือโคโดเมน)
ฟั งก์ชนั สมบูรณ์ (total function) เกิดการเชื่อมโยงข้อมูลทุกตัวของโดเมน
ฟั งก์ชนั บางส่วน (partial function) เกิดการเชื่อมโยงข้อมูลบางตัวของโดเมน
ฟั งก์ชนั
11

ตัวอย่าง total function และ partial function

ตัวอย่าง Formal parameter และ Actual parameter
sign (6)
แคลคูลสั แลมป์ ดา (Lambda calculus)
12




คิดขึ้ นโดย Alonzo Church ในปี ค.ศ.1941
เพื่อใช้เป็ นโมเดลอธิบายการทางานของฟั งก์ชนั โดยใช้การแปลงรูปของ
สัญลักษณ์ไปสู่รปู แบบปกติซึ่งเป็ นผลลัพธ์สุดท้ายของฟั งก์ชนั
ช่วยให้เข้าใจส่วนประกอบต่างๆ ของการโปรแกรมเชิงหน้าที่
สามารถเข้าใจความหมายของฟั งก์ชนั โดยไม่อิงกับไวยากรณ์ ในภาษาใดๆ
นิ ยามแคลคูลสั แลมป์ ดา
13


ใช้ตวั อักขระในภาษากรีก lambda) เพื่อแทนฟั งก์ชนั
รูปแบบ
……………………………………………
………….. ใช้ระบุวา่ เป็ นฟั งก์ชนั
………….. เป็ นพารามิเตอร์ชนิ ดฟอร์มอล
………….. ใช้แยกส่วนบอดี้ ออกจากส่วนหัวของฟั งก์ชนั
………….. การนิ ยามฟั งก์ชนั จะต้องอยูภ่ ายในเครื่องหมายวงเล็บ
การเรียกใช้ฟังก์ชนั แคลคูลสั แลมป์ ดา
14


การเรียกใช้ฟังก์ชนั ใช้วธิ ีการส่งพารามิเตอร์จริง (actual parameter) ให้กบั
ฟั งก์ชนั แล้ว binding ค่านั้นเข้ากับตัวแปร
ตัวอย่าง
((x. x*x) 2)
x คือ………………………….
2 คือ ........................................
ผลลัพธ์ .........................................
เคอรีอิ้ง (currying)
15


Haskell B. Curry ปรับปรุงแคลคูลสั แลมป์ ดาให้ทางานกับฟั งก์ชน
ั ที่มีหลาย
พารามิเตอร์ได้
เช่น ฟั งก์ชนั การคูณ
รูปแบบฟั งก์ชนั : f(x,y) = x * y
สามารถเขียนได้ในรูปแบบแคลคูลสั แลมป์ ดา : .........................................
การคานวณค่านิ พจน์แลมป์ ดา
16



วิธีการคานวณค่าผลลัพธ์จะใช้วิธีการแปลงรูปนิ พจน์ (rewrite) ไปจนกระทัง่ ได้
รูปแบบปกติ (normal form) คือ นิ พจน์ที่ไม่ได้อยูใ่ นรูปแบบของการเรียกใช้ฟังก์ชนั
ตัวอย่าง ((y. ((x. xyz) a)) b)
แคลคูลสั แลมป์ ดา มีคุณสมบัติการมีรปู แบบปกติรปู แบบเดียวของ Church-Rosser
Theorem หมายถึง ลาดับการทางานของฟั งก์ชนั จะเป็ นอย่างไรก็ได้ โดยผลลัพธ์ของ
ฟั งก์ชนั จะไม่เปลี่ยนแปลง
17
LISP and Racket(Scheme)
ภาษาลิสป์ (LISP language)
18



LISP (List and Symbol Processing Language) ถูกสร้างขึ้ นโดย John
Macarthy ค.ศ. 1958
จัดเป็ นภาษาระดับสูงที่มีอายุเก่าแก่รองจากฟอร์แทรน
ถูกสร้างขึ้ นเพือ่ ประมวลผลกับข้อความประเภทสัญลักษณ์ต่างๆ
ภาษาลิสป์ (LISP language)
19



รูปแบบของข้อมูลจะถูกเขียนอยูใ่ นเครื่องหมายวงเล็บรูปแบบพรีฟิกซ์
เช่น เคลคูลสั แลมป์ ดา :
(x. (y. x + y) )
สามารถแปลงเป็ นภาษา LISP ได้ดงั นี้
ภาษา LISP :
(LAMBDA (X Y) (PLUS X Y))
ภาษาแร็กเก็ต (Racket language)
20





มีรากฐานมาจาก LISP แต่ปรับปรุงโครงสร้างให้มีขนาดเล็กลง
ชื่อเดิมคือภาษาสคีม (Scheme)
เลือกใช้ Racket ในการแนะนาการโปรแกรมเชิงหน้าที่ เนื่ องจากเป็ นภาษาที่
แสดงลักษณะเด่นของ LISP ได้ครบ เช่น การจัดฟั งก์ชนั เป็ นข้อมูลพื้ นฐาน
และการจัดการกับลิสต์ และสัญลักษณ์
ตัวแปลภาษาของ Racket จะเป็ นแบบอินเตอร์พรีตเตอร์ คือ การสัง่ งานจะ
เป็ นลักษณะแบบตอบโต้
เลิกใช้งานโปรแกรมพิมพ์ (exit) หรือ (quit)
โปรแกรมในภาษา Racket
21


โปรแกรมจะประกอบขึ้ นจากนิ พจน์ในรูปแบบพรีฟิกซ์ เช่น
(+ 2 3)
(* 5 (+ 2 3))
(max 2 3 5)
ข้อดีของนิ พจน์รปู แบบพรีฟิกซ์ สามารถเขียนนิ พจน์ที่มคี วามยืดหยุน่ ทางาน
กับโอเปอร์แรนด์จานวนเท่าใดก็ได้
(* 1 2 3 4 5)
; evaluates ………
นิ พจน์ในภาษา Racket
22
แบ่งได้เป็ น 4 ประเภท
1. นิ พจน์คณิตศาสตร์ (arithmetic expressions) เป็ นนิ พจน์ที่ให้ค่าเป็ นจานวนเลข
เช่น
(define a 10)
(+ a 20)
; evaluates to ………
(+ (- a 20) 5) ; evaluates to ………

นิ พจน์ในภาษา Racket(ต่อ)
23
2. นิ พจน์ตรรกะ (Boolean expressions) เป็ นนิ พจน์ที่ให้ค่าเป็ นจริง (#t) หรือเท็จ
(#f)
(< 1 2)
; has the value ….
(>= 3 4)
; has the value ….
(= 4 4)
; has the value ….
(not(> 5 6))
; has the value ….
(and(< 3 4) (= 2 3))
; has the value ….
(or(< 3 4) (= 2 3)) ; has the value ….
นิ พจน์ในภาษา Racket (ต่อ)
24
3. นิ พจน์แบบมีเงื่อนไข (conditional expressions) เป็ นนิ พจน์เลือกทางานโดย
ขึ้ นกับเงื่อนไขที่ระบุ มี 2 ประเภทคือ if และ cond
3.1 นิ พจน์ if
(if <condition> <true-expression> <false-expression>)
เช่น
(if (> 5 4) 42 99) ; has the value ……
(if (< 5 4) 42 99) ; has the value ……
(if (> 5 0) 33)
; has the value ……
(if (< 5 0) 33)
; has the value ……
นิ พจน์ในภาษา Racket (ต่อ)
25
3.2 นิ พจน์ cond
รูปแบบ:
(cond
(<tes-exp1> <expression1>)
(<tes-exp2> <expression2>)
...
(else <else-exp>))
ตัวอย่าง:
(cond
((> 3 3) "greater")
((< 3 3) "less")
(else "equal") )
; has the value …………..
(define n -5)
(cond
((< n 0) "negative")
((> n 0) "positive")
(else "zero") )
; has the value …………
นิ พจน์ในภาษา Racket (ต่อ)
26
4. นิ พจน์แลมป์ ดา (lambda expressions) เป็ นนิ พจน์ที่ใช้นิยามฟั งก์ชนั เช่น
เช่น เคลคูลสั แลมป์ ดา :
(x. (x + 1))
สามารถเขียนในภาษา Racket ได้ดงั นี้
(lambda (x) (+ x 1))
; ฟั งก์ชนั เพิ่มค่า 1 ให้กบั พารามิเตอร์
((lambda (x) (+ x 1)) 3)
; มีค่า 4
(define add (lambda (x) (+ x 1)))
;ตั้งชื่อให้กบั ฟั งก์ชนั
(define (add x) (+ x 1))
;ใช้รปู ย่อที่ไม่ตอ้ งมีคาว่า lambda
(add 3)
; เรียกใช้ฟังก์ชนั ที่ต้งั ชื่อแล้ว
นิ พจน์ในภาษา Racket (ต่อ)
27

เพื่อความสะดวกในการนิ ยามฟั งก์ชนั สามารถเขียนในรูปแบบย่อได้
ตัวอย่าง จงเขียนรูปย่อของฟั งก์ชนั ด้านล่าง
(define square (lambda (x) (* x x)))
(define triangle (lambda (x y) (* 0.5 x y)))
 เขียนรูปแบบย่อได้เป็ น
……...............................................................................................
……...............................................................................................
Defining Functions
Similar C code is:
int sq(int x)
{ return x*x; }
28
Defining Functions
Similar C code is:
int myMax(int x,int y)
{ if (x > y)
return x;
else
return y;
}
29
Combining Functions
• Scheme functions can be easily combined together
 make
a function call be the argument of another
function
function call
arguments
30
Built-in Functions
31













max, min
+, *, -, /
quotient, modulo, remainder
ceiling, floor, abs, magnitude, round, truncate
gcd, lcm
exp, log, sqrt
sin, cos, tan
<, >, = , <=, >=
real?, number?, complex?, rational?, integer?
zero?, positive?, negative?, odd?, even?,
exact?
and, or, not
equal?, boolean?, char?
>(number? 5)
#t
>(number? “a”)
#f
> (modulo 8 3)
2
> (gcd 4 8 20)
4
> (sqrt 55.55)
7.453187237685633
> (exact? -4.4444)
#f
> (define a 4)
(equal? 4 a)
#t
ตัวอย่างการใช้งาน build-in functions
32
(define x 3)
; x has the value 3
 (if (even? x) 7 (+ x 5)) ; expression has the value 8

ลิสต์ (List)
33




LISP และ Racket เป็ นภาษาที่ถกู ออกแบบมาเพื่อให้ประมวลผลกับลิสต์ ดังนั้น
ลิสต์จึงเป็ นโครงสร้างข้อมูลพื้ นฐานของภาษา
ลิสต์ เป็ นชนิ ดข้อมูลแบบคอมโพสิต คือ กลุ่มของข้อมูลที่เรียงลาดับตาม
ตาแหน่ งที่ปรากฏภายในลิสต์ คล้ายกับอาร์เรย์แต่ต่างกันตรง
......................................................................................................................
การประกาศลิสต์ ใช้คาสัง่
quote(1 2 3 4) หรือ ‘(1 2 3 4) หรือ (list 1 2 3 4)
สมาชิกตัวแรกในลิสต์เรียกว่า head ส่วนตัวอื่นๆ จะถูกเรียกว่า tail
การประมวลผลลิสต์
34

ทุกๆ ลิสต์จะต้องใช้ () แทนสัญลักษณ์ลิสต์วา่ งปิ ดท้ายเสมอ บอกการสิ้ นสุด
ของลิสต์ เป็ นประโยชน์เมือ่ ใช้การทางานกับฟั งก์ชนั recursive
ตัวอย่าง ‘(I like programming)
‘(I ‘(like) programs ‘(with no objects))
ฟั งก์ชนั ภายในลิสต์
35
ฟั งก์ชนั ภายในลิสต์
36
(cadr x)
; returns the head element of the tail of x
37
List Operation Examples
combining reverse
and append
38
ฟั งก์ชนั เวียนบังเกิด (recursive function)
39



คือ ฟั งก์ชนั ที่เรียกตัวเองซ้า
ประกอบด้วย 2 ส่วน คือ ……………………………………………………..
เช่น
(define (factorial n )
(if (< n 1) 1
(* n ( factorial ( – n 1)))))
ฟั งก์ชนั เวียนบังเกิด (ต่อ)
40

ตัวอย่างฟั งก์ชนั sum รับข้อมูลเข้าเป็ นลิสต์ของตัวเลข เช่น (1 2 3 4) แล้วบวก
จานวนทั้งหมด ส่งค่ากลับเป็ นค่าผลรวม 10
( define (sum alist)
(if (null? alist) 0
(+ (car alist) (sum (cdr alist)))) )
> (sum '(1 2 3 4))
10