..
การแนะนำ
การเขียนโปรแกรมทำงาน (FP) เป็นทางเลือกที่กระบวนทัศน์ในการเขียนโปรแกรมเพื่อให้แบบดั้งเดิม (การเขียนโปรแกรมโครงสร้างหรือความจำเป็นและ object - oriented programming) ที่คิดค้นเป็น"แลมบ์ดาแคลคูลัส"โดย อลอนโซ่คริสตจักร ใน 30 ปีที่ดีก่อนที่จะเป็นที่รู้จักกันว่า ว่าสิ่งที่มันเป็นคอมพิวเตอร์
การศึกษาของคริสตจักรทำหน้าที่เป็นพื้นฐานสำหรับการพัฒนาโปรแกรมภาษา Lisp, และแล้วพวกเขาก็ถูกทอดทิ้งเกือบสมบูรณ์เช่นที่พวกเขาอ้างว่าการเขียนโปรแกรมคอมพิวเตอร์ที่จำเป็นที่สร้างพื้นฐานและเป็น Pascal, C, และในวันนี้ที่ทันสมัย C + + และ Java
แนวคิดพื้นฐานของแคลคูลัสแลมบ์ดาเป็นที่โปรแกรมคอมพิวเตอร์ที่สามารถแสดงแทนการตั้งค่าบังคับของคำสั่ง (ทำเช่นนี้แล้วการทำเช่นนี้แล้วไม่ว่า) กับชุดของฟังก์ชันที่มีพารามิเตอร์เป็นหมายเลขเดียวกัน ฟังก์ชั่น
โปรแกรมการทำงานเป็นมักจะประกอบด้วยฟังก์ชั่นที่ใช้เป็น input ฟังก์ชันการทำงานที่ใช้เวลาทำงานอื่นเป็น input อื่น, และดังนั้นบน
ซึ่งหมายความว่าในขณะที่โปรแกรมแบบที่เขียนในกระบวนทัศน์ความจำเป็นหรือวัตถุประกอบด้วยชุดของคำสั่งว่าการกระทำกับตัวแปรที่มีค่าหมายถึง"รัฐ"ของโปรแกรมการเขียนโปรแกรมการทำงานในแนวคิดมากของตัวแปรไม่ได้อยู่ (มีแนวคิดของ"รัฐ"ไม่เป็น) และการดำเนินการที่ได้รับมอบหมายไปยังหมายเลขของฟังก์ชั่นที่ทำงานในการทำงานคงที่
ที่น่าสนใจในภาษาทำงานที่ได้รับการหายไปในช่วงเวลาหลายสาเหตุส่วนใหญ่ยวดความยากลำบากของการเรียนรู้ (โดยปกติจะมีคนคิดว่าของวัตถุมากกว่าฟังก์ชั่นเว้นแต่เขาเป็นนักคณิตศาสตร์!) และความยากลำบากในการหา ล่ามที่มีประสิทธิภาพหรือคอมไพเลอร์
Ruby และ FP
วันนี้ที่น่าสนใจนี้ได้รับการปลุกให้ตื่น แต่เนื่องจากการเขียนโปรแกรมทำงานทำให้มีผลมาจากการที่มีคุณค่ามาก : มันไม่สามารถนำไปสู่ความหมายโดยข้อบกพร่องที่ใช้เวลา ในคำอื่น ๆ ที่รวบรวมเวลาหรือเป็นครั้งแรกที่ทั้งมันทำงานหรือไม่ทำงาน ไม่สามารถทำงานในวิธีการที่ไม่ได้คาด a priori (ในโปรแกรมการทำงานในความเป็นจริงมีแนวคิดของไม่มีข้อยกเว้น)
ดังนั้นจึงเกิดและบางส่วนจะเจริญรุ่งเรืองภาษาทำงาน (มากหรือน้อยบริสุทธิ์และมีการสนับสนุนมากขึ้นหรือน้อยสำหรับการเขียนโปรแกรมแบบดั้งเดิม) เช่น : ML / OCaml , Haskell , F # .
Ruby เป็นภาษาที่ไม่ได้ทำงาน แต่จะใช้เทคนิคการเขียนโปรแกรมการทำงานที่ช่วยให้เราสามารถที่จะกำหนดขั้นตอนวิธีการสังเคราะห์มากขึ้น, มีศักยภาพมากขึ้นและมีประสิทธิภาพมากขึ้น นอกจากนั้นมักจะง่ายต่อการอ่าน
และแต่ละแผนที่
ลักษณะแรกของภาษาที่สนับสนุนในทาง FP บางเป็นไปได้ใน iterators ห้องสมุดมาตรฐานการทำงานของคุณ ตัวอย่างเช่น
$ องค์ประกอบ = [1,2,3,4,5]
Elementi.map $ {| elem | ทำให้ elem} + 1
ฟังก์ชั่น"แผนที่"และ"หยุด"ของทับทิมมีอะไรมากกว่าที่ใช้ FP!
ในความเป็นจริงมีฟังก์ชันที่มีหน้าที่อื่นตามที่มีข้อโต้แย้ง
ใน Ruby แล้วว่าชิ้นส่วนเหล่านั้นของบล็อกของรหัสที่อยู่ใน {} หรือระหว่างทำงานที่ไม่ระบุทำ / วางสายจะถูกสร้างขึ้นเฉพาะที่จะหัวข้อของการทำงานหลาย
ฟังก์ชั่นเหล่านี้เรียกว่าฟังก์ชั่นใน FP high - order, ฟังก์ชั่นเช่นที่ใช้เป็นหลายหน้าที่เป็นอินพุท
โดยเฉพาะอย่างยิ่งการกระทำ"แผนที่"เป็นฟังก์ชั่นคลาสสิกและคณิตศาสตร์ที่สามารถอ่านได้ดังต่อไปนี้สำหรับองค์ประกอบของชุด 1-5 แต่ละเรียกใช้ฟังก์ชัน : พิมพ์จำนวนธรรมชาติต่อไป
ว่า"แผนที่"หรือ"บริษัท "สำหรับองค์ประกอบของแต่ละคอลเลกชัน (อาร์เรย์ใน Ruby เราจะกล่าวว่า) การทำงานบางอย่างที่กำหนดไว้ในบล็อก
สิ่งเดียวกันที่จะเกิดขึ้นตามธรรมชาติด้วย :
Elementi.each $ {...}
ปิด : proc และแลมบ์ดา
ปิดที่มีแนวคิดคล้ายกับว่าการสั่งซื้อสูงฟังก์ชัน : ความสามารถในการกำหนดอย่างมีนัยสำคัญการทำงานของตัวแปรที่ทำหน้าที่เกี่ยวกับการใช้ชีวิตในบริบทที่แตกต่างจากของฟังก์ชัน (เช่นตัวแปรระดับโลกหรือตัวแปรของฟังก์ชันอื่น ๆ ) เป็นที่
ใน Ruby, ฉันสามารถเขียนปิดการใช้ฟังก์ชันที่ไม่ระบุชื่อที่สามารถกำหนดด้วยคำหลัก Proc.new หรือ lambda
นี่คือตัวอย่าง :
คูณ def (คูณ)
กลับ lambda {| n | n คูณ *}
ท้าย
per3 คูณ = (3)
ทำให้ per3.call (3) # => 9
ทำให้ per3.call (per8.call (2)) # => 48
ไม่ตรงกับตัวเองชัดเจนในตัวอย่างนี้ผมกำหนดฟังก์ชัน"คูณ"
ฟังก์ชั่นนี้แปลก ๆ คืออะไร?
ที่นี่ฉันก็ไม่ได้ใช้ตัวแปรใด ๆ !
อาร์กิวเมนต์ไม่ได้เป็นตัวแปรตัวคูณเป็นเพียงตัวยึดสำหรับค่าคงที่หรือฟังก์ชันอื่น
แต่ในการเขียนโปรแกรมแบบดั้งเดิม, ฉันเขียน :
คูณ def (a, b)
กลับ b *
ท้าย
ทำให้การคูณ (3.3)
ที่สามารถเห็นได้ แต่ผมกำหนดปิดใช้"ดำเนินการ"ที่ผมเรียก per3 ซึ่งกำหนดพฤติกรรมของทั้งหมดคูณ"x3"
จากนั้นผมเรียกว่าการดำเนินการนี้ 3 จำนวน
ฉันยังสามารถเรียกมัน recursively!
หรือเรียกว่าแทนค่าคงที่ในการทำงานอื่น
ในการเขียนโปรแกรมแบบดั้งเดิม แต่ผมถูกบังคับให้กำหนดล่วงหน้าจำนวนของตัวแปรที่เกี่ยวข้องในการทำธุรกรรม -- จึง จำกัด การคูณของจำนวนสองจำนวน -- และที่สำคัญที่สุดที่ฉันมีการแทรกแนวคิดของรัฐที่มีการจัดสรรหน่วยความจำสำหรับตัวแปรสองตัวที่ มีค่าที่จะคูณ
| |
Ruby และ Ruby on Rails (หลักสูตร)
สร้างโปรแกรมซอฟต์แวร์และเว็บด้วยทับทิมและ ร. จาก 39 € |