1 / 18

Functional Programming

Functional Programming. Programming paradigms. Imperative Objected-oriented Functional logic. Procedural programming. Non-procedural programming Or Declarative programming. Procedural programming. วิธีการสั่งงานได้รับอิทธิพลโดยตรงจากสถาปัตยกรรมของคอมพิวเตอร์

jayden
Télécharger la présentation

Functional Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Functional Programming

  2. Programming paradigms • Imperative • Objected-oriented • Functional • logic Procedural programming Non-procedural programming Or Declarative programming

  3. Procedural programming • วิธีการสั่งงานได้รับอิทธิพลโดยตรงจากสถาปัตยกรรมของคอมพิวเตอร์ • Von Neumann machine ประกอบดว้ย • หน่วยประมวลผลกลาง ควบคุมและประมวลผลคำสั่ง • หน่วยความจำ เก็บชุดคำสั่งของโปรแกรมและข้อมูลที่จะใช้ • ใช้แนวคิดในการเปลี่ยนสถานะ (ค่าในหน่วยความจำ) ของเครื่องไปตามลำดับ จนได้ผลลัพธ์ที่ต้องการ • มักใช้คำสั่งกำหนดค่า (assignment statement) เป็นหลัก ในการควบคุมการทำงาน • มีคำสั่งประเภทอื่นๆ ประกอบในการกำหนดลำดับการทำงาน เช่น คำสั่งวนซ้ำ คำสั่งแบบมีเงื่อนไข

  4. Program Modulo • Read M1 • Read M2 • M1 = M1 - M2 • If M1 >= 0 then goto (3) • M1 = M1 + M2 • Write M1 • halt

  5. สถานะของคอมพิวเตอร์ขณะประมวลผลโปรแกรม Modulo

  6. Non-procedural programming • ออกแบบเพื่อลดอิทธิพลของลักษณะการทำงานของเครื่อง • การเขียนโปรแกรมเป็นอิสระจากฮาร์ดแวร์ • ภาษาเชิงหน้าที่ • ใช้ฟังก์ชั่นที่คล้ายกับฟังก์ชั่นทางคณิตศาสตร์ • ระบุการเชื่อมโยงค่าจากข้อมูลเข้าไปยังผลลัพท์ • ไม่ต้องระบุขั้นตอนการเปลี่ยนแปลงสถานะภายในเครื่อง • ภาษาเชิงตรรกะ • ใช้ความสัมพันธ์เป็นส่วนประกอบหลักในการเขียนโปรแกรม • เป็นการพิสูจน์ความจริงของความสัมพันธ์ทั้งหลายที่ระบุไว้ • ไม่ต้องระบุลำดับการทำงานให้กับโปรแกรม

  7. Functional programming • ส่วนประกอบที่สำคัญ • โครงสร้างข้อมูลพื้นฐาน คือ ลิสต์ (list) • ฟังก์ชั่นพื้นฐาน • โครงสร้างที่ใช้สร้างฟังก์ชั่นจากฟังก์ชั่นที่มีอยู่ • โปรแกรมประกอบด้วยฟังก์ชั่น นิยามจากนิพจน์ (expression) • ค่าเดี่ยว • นิพจน์ย่อย • นิพจน์แบบมีเงื่อนไข

  8. Imperative vs. Functional int fact(int n) { int i = 1; for (int j = n; j>1; --j) i = i * j; return I; } fun fact(0) = 1 | fact (n) = n * fact(n-1); • ไม่มีคำสั่ง (statement) • ประกอบด้วยนิพจน์ • สั่งให้ทำซ้ำโดยใช้ recursive function • เรียกใช้ฟังก์ชั่นให้ทำงาน แทนการระบุในรูปคำสั่ง เช่น fact(3)

  9. การประมวลผล กลไกพื้นฐาน 2 ประการ • การเชื่อมโยงระหว่างชื่อกับค่า (binding) • การเรียกใช้ฟังก์ชั่น (application) fact(3) • เชื่อมโยง 3 กับชื่อ n ในโปรแกรม • เรียกใช้ฟังก์ชั่นที่ n มีค่าเป็น 3

  10. ฟังก์ชัน (Function) • การเชื่อมโยงข้อมูลจากเซตของโดเมน ไปยัง ข้อมูลในเซตของเรนจ์ (โคโดเมน)

  11. การเชื่อมโยงข้อมูล (Mapping) • Total function • การเชื่อมโยงข้อมูลทุกตัวในเซตของโดเมน • Partial function • การเชื่อมโยงข้อมูลบางตัวในเซตของโดเมน • ข้อมูลหนึ่งตัวจากเซตของโดเมนจะเชื่อมโยงไปยังข้อมูลเพียงตัวเดียวในเซตของเรนจ์ • การนิยามฟังก์ชั่นไม่กำกวม

  12. การอธิบายการเชื่อมโยงการอธิบายการเชื่อมโยง • การแจกแจงทุกการเชื่อมโยง • แผนภาพ • กฏหรือสมการ • Format and actual parameters

  13. แคลคูลัสแลมป์ดา (Lambda calculus) • แคลคูลัสอย่างง่าย • ใช้เป็นโมเดลอธิบายการทำงานของฟังก์ชั่น • เป็นพื้นฐานในการออกแบบภาษาเชิงหน้าที่ • ใช้เครื่องหมาย l (lambda)แทนฟังก์ชั่น • ตัวอย่างการนิยามฟังก์ชั่น lx.x*x • การเรียกใช้ ((lx.x*x )2)

  14. นิพจน์แลมป์ดา • นิพจน์ในแคลคูลัสแลมป์ดามีอยู่ 3 ประเภทคือ • ตัวระบุ หรือตัวแปรเดี่ยว (single identifier) • นิยามฟังก์ชัน (function definition, or abstraction) (lx. M) • การเรียกมใช้ฟังก์ชัน (function application) เขียนอยู่ในรูป MN((lx. X*x)2) • ตัวอย่างนิพจน์แลมป์ดา x (lx. x) ((lx. x) (ly. y))

  15. นิพจน์แลมป์ดา • อาจละเว้นวงเล็บได้ • มีลำดับจากซ้ายไปขวา • Alonzo Church • สร้างแคลคูลัสแลมป์ดาขึ้นมาให้คำนวณฟังก์ชันที่มีพารามิเตอร์ตัวเดียวเช่น (lx. x*x) • Haskell B. Curry • ฟังก์ชันหลายพารามิเตอร์ • Currying technique f(x, y) = x*y => (lx. (ly. x*y)) หรือ (lx. (ly. X*y)) 2 => (ly. 2*y)

  16. การคำนวณค่านิพจน์แลมป์ดาการคำนวณค่านิพจน์แลมป์ดา • วิธีการแปลงรูปนิพจน์ (rewrite) จนได้รูปแบบปกติ (normal form)((ly. (lx. xyz)a)b) => • แม้ใช้ลำดับที่ต่างกันในการ rewrite แต่ผลลัพธ์นำไปสู่รูปแบบปกติที่เหมือนกัน ซึ่งคุณสมบัติการมีรูปแบบเดียวขแงแคลคูลัสแลมป์ดา เรียกว่า มีคุณสมบัติตามทฤษฎีของเชิร์ชและรอสเซอร์ (Church-Rosser theorem) • การคำนวณค่านิพจน์แลมป์ดาจะกระทำตามกฏการแปลงรูปนิพจน์ (rewrite rules) หรือบางครั้งเรียกว่า กฏการลดรูปนิพจน์ (reduction rules) • -conversion • -reduction

  17. การแปลงแบบอัลฟ่า (-conversion) • lx. M => ly. {y/x} M, y is not free in M • ถ้า x เป็น bond parameter เราสามารถเปลี่ยนชื่อตัวแปร x เป็น y แต่ทั้งนี้ ชื่อ y จะต้องไม่ปรากฏเป็นตัวแปรอิสระใน M • สัญลักษณ์ {y/x} หมายถึงการแทนชื่อ x ด้วย y • ตัวอย่าง(lxyz. xz(yz)) (lx. x) (lx. x) => (lxyz. xz(yz)) (lu. u) (lv. v)

  18. การลดรูปแบบเบต้า (-reduction) • lx. M => {N/x} M • จาก (lxyz. xz(yz)) (lu. u) (lv. v) => (lxyz. xz(yz)) (lu. u) (lv. v) => (lyz. (lu. u)z(yz)) (lv. v) => (lz. (lu. u)z((lv. v)z)) => (lz. (lu. u)z(z)) => (lz. (z) (z)) => (lz. zz)

More Related