Introduction to Scala Programming ตอนที่ 4

Ratapong Ruksasuk
Scale360 Engineering
2 min readNov 11, 2017

ในตอนที่ 4 จะยังอยู่ในส่วนของ Functional Programming ในตอนนี้ผมจะเล่าเรื่องของ Monoid Monad มันจะมีคุณสมบัติติดตามกันได้เลย .

การอธิบายต่อไปนี้เป็นความเข้าใจส่วนตัวของผมนะครับ ผิดพลาดประการใด ขออภัยด้วยนะครับ

Monoid กับ Monad คืออะไรล่ะ ????

เริ่มต้นเลยก็จะเริ่มจาก Monoid ก่อนเลย Monoid นี้เป็นรูปแบบทฤษฎีส่วนหนึ่งของพีชคณิต ซึ่งคุณสมบัติที่ตัวของมันเองจะมีเป็นลักษณะหลักๆ คือ

  1. identity element. (เอกลักษณ์)
  2. associative binary operation.

โดยคุณสมบัติอย่างแรกที่จะกล่าวขึ้นมาก็คือ Identity element (เอกลักษณ์) ตามหลักคณิตศาสตร์แล้วคุณสมบัติของมันจะเน้นไปที่ทำให้ค่าตัวแปร มีผลลัพธ์ที่ทำให้ยังคงเดิมอยู่ อย่างเช่น X + 0 โดยที่ให้ X เป็นจำนวนจริง ทำให้ผลลัพธ์นั้นยังคงเป็นตัวแปร X เหมือนเดิมเพราะฉะนั้น Identity element ก็คือ 0 สามารถดูคุณสมบัติเพิ่มเติมได้จากรูปข้างล่างได้เลยนะครับ

อีกหนึ่งคุณสมบัติก็คือ Associative binary operation จะมีสมการเป็นคุณสมบัติในรูปแบบของการสลับที่หรือสลับกลุ่ม โดยในการสลับนั้นถ้าเกิดว่าทำให้ผลลัพธ์ยังเหมือนเดิมจะเรียกว่าเป็น Monad เช่น a * (b * c) ถ้าเกิดว่าสลับที่ก็จะเป็น (a * b ) * c จะทำให้ผลลัพธ์ของทั้งสองสมการนี้ผลลัพธ์ยังคงเหมือนกันทั้งคู่ ซึ่งจะมีคุณสมบัติที่เป็นในรูปแบบของการจัดกลุ่มหรือสลับที่ มีมากกว่าที่ยกตัวอย่างขึ้นมา

แล้วทำไมถึงนำมาใช้ใน Functional Programming ล่ะ ???

เอาตามที่ผมเข้าใจและได้ถามผู้ที่เชี่ยวชาญในเรื่องนี้มากกว่าผมนะครับ ในส่วนตัวคิดว่านำมาแก้ปัญหาดังนี้

  1. แก้ปัญหาของการเกิด Side Effect ช่วยทำให้ค่าของสมการหรือตัวแปรนั้นไม่มีข้อผิดพลาด
  2. ทำให้ปัญหาที่เราได้แก้ไขไว้ ไม่หลุดไปจากที่เราได้วางแผนตามที่ได้แก้ไว้

Monad ?? คืออะไรทำไมต้องมีขึ้นมา

Monad นั้นเป็น concept ที่ได้พัฒนาการแก้ปัญหาโดยนำวิธีมาจาก Monad เพื่อนำมาแก้ไขปัญหาที่เกิดโดยที่เราคิดว่าไม่น่าจะเกิดขึ้นมา ผมจะยกตัวอย่างเช่น ถ้าเกิดว่ามีคนอยู่ 5 คน แล้วให้ 1 คนเขียนโจทย์ขึ้นมา แล้วให้อีก 4 คนให้คำตอบโดยการ ห้ามพูดขึ้นมา ทำให้แต่ละคนมีวิธีการของตัวเองในการบอกคำตอบเช่น การใช้นิ้วขึ้นมา หรือ การเขียน หรือ การเคาะให้เกิดเสียงขึ้นมา ซึ่งปัญหาเหล่านี้เราอาจจะไม่สามารถควบคุมมันได้ในรูปแบบที่ผมยกตัวอย่างขึ้นมา

ถ้าเกิดว่าอยู่ในรูปแบบของ Code จะเป็นรูปแบบยังไงล่ะ??

ผมเองก็ถนัดในส่วนของการใช้ Scala ซึ่งการแก้ปัญหาของภาษา Scala นั้นมีการเรียกใช้ฟังก์ชันที่เรียกว่า Flatmap ซึ่งจะลบค่าที่เป็น Side effect หรือค่าที่เราไม่ต้องการให้มันมี ทำให้เราได้คำตอบออกมา เช่น จากตัวอย่างที่ได้ยกตัวอย่างมา คนเขียนโจทย์ขึ้นมาเขียนว่า 1+2 = ? ซึ่งก็จะได้คำตอบในรูปแบบของ List(some(3),some(3),some(3),some(3)) โดยผมมอง List ถึงจำนวนคนที่มี และ some คือวิธีการต่างๆ เพื่อแสดงคำตอบ ซึ่งใน Scala จะใช้ Flatmap มาจัดการปัญหานี้ จะทำให้เกิดคำตอบที่แท้จริงคือ List(3,3,3,3) ซึ่งจะได้คำตอบที่เราต้องการมันมาจริงๆ นั่นก็คือ 3 ที่ทุกๆคนตอบ ในส่วนของทฤษฎี Monad ผมก็ยังไม่แม่นพอ แต่ก็นำวิธีการแยกตัวอย่างขึ้นมาให้ได้เห็น ซึ่งภาษาที่มีการใช้ Monad มาด้วยก็คือ Haskell ( อาจจะมีมากกว่านี้ )

* ถ้าใครมีอะไรที่จะให้ผมเพิ่มเติมในบล็อกนี้ ก็พิมพ์ได้เลยนะครับ ผมจะได้แก้ไขเพื่อให้ข้อมูลถูกต้อง ผู้อ่านจะได้เข้าใจอย่างถูกต้องชัดเจน

ก็จบไปแล้วนะครับสำหรับตอนที่ 4 ซึ่งผมห่างหายไปนาน ในส่วนของเรื่อง Monad Monoid ผมก็เขียนตามที่ผมได้อ่านมานะครับ ถ้าเกิดใครสนใจเพิ่มเติมก็ อ่านเพิ่มได้ตามลิ้งข้างล่างเลยนะครับ

--

--