Category: Functional Programming

4

JavaScript #03: ในมิติ Functional Programming

เกริ่นนำ บทความนี้เป็นบทความที่ผมตั้งใจเขียนเพื่อขยายความ functional programming (FP) ของบทความชุดก่อน ตอนแรกตอนที่กำลังเริ่มเขียน ผมก็มาไล่ดูว่าน่าจะเขียนอะไรบ้าง ยิ่งไล่ก็ยิ่งบาน มีเรื่องต้องเขียนและเรื่องที่ควรเขียนเพิ่มมากมาย จบในบทความเดียวไม่ได้ ก็เลยคิดไปคิดมา ขยายเนื้อหาในบทความขึ้นเป็นชุด และลามไปถึงกลายเป็นหมวดในที่สุด ผมก็เขียนปูพี้นมาสองบทแล้ว จนบทนี้เป็นบทที่ 3 ซึ่งเป็นเนื้อหาหลักที่ผมอยากเขียนในเบื้องแรกสุด ลองอ่านดูครับ น่าจะสนุก พื้นฐาน functional programming ในหัวข้อนี้ผมจะพิจารณาฟังก์ชันของ ECMAScript เทียบกับ FP ว่าตรงนิยามหรือไม่ตรงอย่างไร รองรับหรือไม่รองรับความสามารถอะไรบ้าง และถือว่าเป็นการทบทวนความรู้ FP ไปในตัว ฟังก์ชันพิสุทธิ์ (pure function) ก่อนจะเข้าเรื่อง more »

ก้าวแรก HPC #09: Thread Library เก่าแต่เก๋า 0

ก้าวแรก HPC #09: Thread Library เก่าแต่เก๋า

เกริ่นนำ เราเริ่มแหย่ขาเข้าสู่โลกแห่งการประมวลผลแบบขนาน โดยผ่านเรียนรู้จากการใช้งาน Apache Spark ซึ่งเป็นโมเดลการเขียนโปรแกรมแบบ MapReduce ที่ได้รับความนิยมอย่างสูงในยุคปัจจุบัน แต่โจทย์เราอาจจะไม่เหมาะสมกับเครื่องมือ เลยทำให้ได้รับผลตอบสนองที่สอบตกทุกวิชา มาวันนี้เราจะย้อนกลับไปโมเดลดั่งเดิม โมเดลที่ไม่ค่อยมีใครเขียนกันแล้วเพราะยุ่งยาก ส่วนมากก็ไปใช้ library ที่ขี่บนโมเดลนี้อีกที โมเดลนี้ก็คือ Fork-Join นั่นเอง ผมว่าถ้าเรียนรู้อย่างเป็นระบบแล้ว ก็ไม่ได้ยุ่งยากอะไร เปิดใจให้กว้างแล้วมาเรียนรู้ด้วยกันครับ เรียนรู้ศัพท์การประมวลผลแบบขนานผ่านมุมมองประวัติศาสตร์ ใครเคยเขียนโปรแกรมทำงานบนโมโครคอนโทรลเลอร์ขนาดเล็กจะเข้าใจดีว่า เมื่อเราเขียนโปรแกรมเสร็จ คอมไพล์ แล้วโหลดโปรแกรมจากคอมพิวเตอร์ไปเก็บไว้ใน flash ของไมโครคอนโทรลเลอร์แล้วก็บูทใหม่ เท่านี้โปรแกรมก็จะเริ่มทำงาน ไม่เห็นจำเป็นต้องมี OS แต่อย่างใด  โปรแกรมที่รันนั้นเป็นโปรแกรมเดียว ไม่สามารถทำงานพร้อมกันหลายโปรแกรมได้ more »

ก้าวแรก HPC #08: Apache Spark กับงาน Big Compute 0

ก้าวแรก HPC #08: Apache Spark กับงาน Big Compute

เกริ่นนำ เราเดินทางตามสายธารของเวลา จากก้าวแรก มาถึงบทความนี้เป็นก้าวทีแปดแล้ว ผมวางพื้นทฤษฎี เครื่องไม้เครื่องมือ ตลอดจนโจทย์ทดสอบที่ใช้งานมาตามลำดับเป็นที่เรียบร้อย มาบทความนี้เราจะมาเรียนรู้การประมวลผลแบบขนานกัน มารีดกำลังของเครื่องคอมพิวเตอร์ของเราให้เต็มที่ เรื่องการประมวลผลแบบขนานนั้นมีรายละเอียดค่อนข้างมาก ในบทนี้ผมจึงขอแตะแค่ชั้นผิวของมันโดยเสพอาหารกล่องสำเร็จรูป เพียงอุ่นเล็กน้อยก็ทานได้เลย ยี่ห้อ Apache Spark ภาคประวัติ Search Engine ของ Google นั้นนับได้ว่าเป็น Search Engine ที่ดีที่สุดในโลก (ก็ว่าได้) Google Search สามารถค้นหาเอกสารที่มีอยู่มหาศาลใน Internet ได้อย่างรวดเร็ว Google ทำได้อย่างไร ทำไมถึงเก่งกาจขนาดนั้น ความลับนี้ถูกเปิดเผยในงานประชุมวิชาการว่าด้วยเรื่องการออกแบบและสร้างระบบปฏิบัติการ more »

ก้าวแรก HPC #06: อัลกอริทึมประสิทธิภาพสูงและการปรับปรุงประสิทธิภาพ 0

ก้าวแรก HPC #06: อัลกอริทึมประสิทธิภาพสูงและการปรับปรุงประสิทธิภาพ

เกริ่นนำ ในบทความที่แล้วผมนำเสนออัลกอริทึมอย่างง่ายเพื่อใช้หาค่า Bernoulli Number มาบทนี้เราจะไปกันต่อครับ เราจะไปเรียนรู้ถึงอัลกอริทึมที่มีประสิทธิภาพสูง สูงจริงครับ เป็นแชมป์ในตอนนี้ และเช่นเคยครับ เราจะมาเรียนรู้การปรับปรุงประสิทธิภาพของอัลกอริทึม ตลอดจนเฉลยการบ้านที่ค้างคามาจากบทความก่อนหน้า การแข่งขันเพื่อหาค่า Bernoulli Number ในบทความที่ผ่านมา ผมใช้อัลกอริทึมอย่างง่าย นั่นคือ Recursive เป็นหาค่า Bernoulli Number ไปจนถึง B(1000) ท่านสงสัยไหมครับว่าค่า Bernoulli Number ที่สูงที่สุดเท่าที่มนุษย์หาได้คือ B ลำดับที่เท่าไร ผมมีคำตอบครับ ลองดูที่ตารางนี้ดูครับ   ข้อมูลจาก http://en.wikipedia.org/wiki/Bernoulli_number อย่างที่เราทราบกับว่า more »

Functional Programming #5 : Filter-Map-Reduce 2

Functional Programming #5 : Filter-Map-Reduce

เกริ่นนำ Filter-Map-Reduce เป็นฟังก์ชันช่วยในการทำงานของ List เหมือนกับ sum หรือ take เป็นต้น แต่ที่แยกออกมาต่างหากนั้น เพราะสามตัวนี้ทำงานสอดประสานกันได้เป็นอย่างดี และมีความสามารถสูงมาก ว่ากันว่ามีฟังก์ชันเพียงสามตัวนี้ ก็สามารถทดแทนฟังก์ชันที่ช่วยจัดการเกี่ยวกับ List ได้เกือบทั้งหมด  ฟังก์ชันทั้งสามนี้เป็นฟังก์ชันมีระดับด้วยกันทั้งสิ้น ทำให้มีความยืดหยุ่นสูง เรามาลองดูรายละเอียดกันครับ ฟังก์ชัน filter ฟังก์ชัน filter นั้นรับพารามิเตอร์สองตัวครับ ตัวแรกเป็นเงื่อนไข และตัวที่สองเป็น List อารมณ์เดียวกันกับ takeWhile ครับ การทำงานก็ไม่มีอะไรซับซ้อนครับ ไล่ list แต่ละตัว more »

Functional Programming #4 : List Processing 0

Functional Programming #4 : List Processing

เกริ่นนำ FP มี List เป็นของคู่กันเห็นได้จากภาษาที่ถือว่าเป็นบิดาของ FP เลยคือ LISP นั้น เอาแค่ชื่อก็ชัดเจนแล้วครับ LISP นั้นย่อมาจากคำว่า List Processing ซึ่งก็แปลตรงตัวว่าการประมวลผล List นั่นเองดังนั้นการประมวลผล List จึงถือเป็นส่วนหลักส่วนหนึ่งของ FP ในเนื้อหาของบทนี้จึงพูดคุยเกี่ยวกันการสร้าง List ตลอดจนฟังก์ชันที่เป็นตัวช่วยการจัดการ List รวมถึงแสดงให้ถึงการสร้างฟังก์ชันเหล่านี้อย่างง่าย เพื่อเป็นการฝึกฝนและเสริมความเข้าใจ ว่าแต่ว่า List คืออะไร List คือโครงสร้างข้อมูลแบบหนึ่งถ้านึกอะไรไม่ออกให้ตั้งต้นที่ Array ก่อน Array more »

Functional Programming #3 : ฟังก์ชันมีระดับ 4

Functional Programming #3 : ฟังก์ชันมีระดับ

เกริ่นนำ ในบทความที่แล้วผมนำเสนอแนวคิดการเรียกตัวเองและฟังก์ชันพิสุทธิ์อันเป็นพื้นฐานของ FP ซึ่งในตอนท้าย ๆ ผมนำเสนอการเพิ่มศักยภาพของฟังก์ชัน โดยการทำฟังก์ชันซ้อนฟังก์ชัน แต่เท่านั้นยังไม่พอครับเพื่อให้ FP เป็นเครื่องมือที่ทรงประสิทธิภาพ เราจึงต้องเข้าไปในตู้โทรศัพท์เพื่อแปลงร่างฟังก์ชันทำให้พิสดารเปรียบเป็นซูเปอร์แมนคือเอากางเกงในสีแดงมาใส่ทับกางเกงนอกนั่นเอง ฟังก์ชันกลายเป็นพลเมืองชั้นหนึ่ง พลเมืองชั้นหนึ่ง (first class citizen) เป็นคำที่หมู่พลเมืองชั้นสองมักจะพูดถึง ซึ่งโดยทั่วไปแล้ว เมื่อคนที่ไปอยู่บ้านเมืองอื่น มักมีปัญหาไม่ได้รับสิทธิเท่าเทียมกับพลเมืองของเจ้าของประเทศ เช่นสิทธิในการรักษาพยาบาลเป็นต้น แล้วในแง่การเขียนโปรแกรมหละอะไรที่เรียกว่าพลเมืองชั้นหนึ่งหรือชั้นสอง เรื่องนี้ดูไม่ยากครับ ดูกันที่อะไรก็ตามถ้าสามารถกำหนดเป็นตัวแปรได้โดยตรงถือว่าเป็นชั้นหนึ่ง ถ้ากำหนดได้แต่โดยอ้อม ๆ หรืออาจไม่ได้เลย เราถือว่าเป็นชั้นสอง แต่ถ้ากำหนดเป็นตัวแปรไม่ได้เลย อันนี้ตีตั๋วชั้นสาม ใครมาก่อนได้ก่อน มาหลังต้องยืน อันนี้ล้อเล่นครับชั้นสามไม่มีนะครับ มีแค่สองชั้นถ้าท่านยังงงอยู่มันเกี่ยวอะไรกับการเขียนโปรแกรม more »

Functional Programming #2 : ฟังก์ชันพิสุทธิ์และการเรียกตัวเอง 2

Functional Programming #2 : ฟังก์ชันพิสุทธิ์และการเรียกตัวเอง

เกริ่นนำ บทนี้เราจะมาเรียนรู้ถึงนิยามของฟังก์ชันในมุมมองของ FP กัน แนวคิดของการสร้างฟังก์ชันพิสุทธิ์ (Pure Function) กลไกฟังก์ชันการเรียกตัวเอง (Recursive Function) รวมถึงการปรับปรุงประสิทธิภาพการเรียกตัวเองอีกด้วย ก่อนจะเข้าเนื้อหา ผมขอปรับความเข้าใจให้ตรงกันสองประการก่อนครับ ข้อแรกเรื่องการแปลศัพท์ทางเทคนิคจากภาษาอังกฤษมาเป็นภาษาไทย ผมจะยึดตามราชบัณฑิตเฉพาะคำที่รู้จักกันอย่างแพร่หลายแล้วเท่านั้น นอกนั้นผมขอบัญญัติคำขึ้นมาเอง เอาให้รื่นหูโดยมีแม่แบบมาจากท่าน ว.ณ เมืองลุง ผู้เขียนหนังสือกำลังภายในจีนที่ผมชอบมาก อย่างฟังก์ชันพิสุทธิ์ นี่ผมก็ตั้งเองนะครับ ตั้งชื่อเอาไว้เพื่อสื่อความเข้าใจเท่านั้น กรุณาอย่านำเอาไปใช้ต่อนะครับ ส่วนเรื่องที่สองเป็นเรื่องที่ผมทำใจค่อนข้างลำบาก แต่ก็ต้องตัดสินใจ คือการอธิบายเรื่อง FP นั้น จำเป็นต้องใช้เลือกใช้ภาษาใดภาษาหนึ่งมาเป็นตัวขับเคลื่อน ถ้าตามใจคนใช้ Python C# Java more »

Functional Programming #1 : ก้าวแรก 6

Functional Programming #1 : ก้าวแรก

เกริ่นนำ เชื่อว่าเกือบทุกท่านที่กำลังอ่านบทความหน้านี้ คงผ่านหูผ่านตาเคยได้ยินคำว่า Functional Programming มาแล้ว แต่ถ้าถามเอาจริงว่ารู้จักมันอย่างจริงจังหรือไม่ มักได้รับคำตอบอย่างจริงใจว่าไม่รู้ ถ้าท่านเป็นหนึ่งในนั้น ก็ขอแสดงความยินดีล่วงหน้าครับ ท่านจะได้รู้จักเพื่อนใหม่ เพื่อนที่จะคอยช่วยเหลือท่าน ทำให้เรื่องยากกลายเป็นเรื่องง่ายขึ้น เพื่อนคนนั้นชื่อว่า Functional Programming นั่นเอง จากนี้ไปผมขอเรียกเขาว่า FP เพื่อให้สั้นสะดวกต่อการเรียกขานนะครับ บทความชุด Functional Programming ตั้งใจเอาไว้ว่าจะมีทั้งหมด 5 บทความ โดยที่นับบทความนี้เป็นตอนแรก โปรดติดตามครับ   ปุจฉา Functional Programming คืออะไร วิสัชนา more »