Haskell List part 4 List Pattern Matching
สามตอนที่แล้ว เราได้เห็นแล้วว่า List นั้นถูกสร้างได้โดยให้แต่ละค่าอยู่ภายใน [] ที่คั่นด้วย , หรือใช้ List Comprehension เพื่อสร้างค่าโดยใช้ความสัมพันธ์ของ List อื่น วันนี้เราจะถูกอีกวิธีว่า List ถูกสร้างมาได้ยังไง และ เราเอามาทำ Pattern Matching เพื่อแกะค่าแต่ละค่าใน List ออกมาได้ยังไง
Function (:)
การเขียน List โดยใช้ [] และ , นั้นเป็นการช่วยทำให้เราเขียนได้ง่ายๆ แท้จริงแล้ว ข้อมูลแบบ List ถูกนิยามไว้ว่า [] คือ List ว่าง ส่วน List อื่นๆเกิดจากการเอาข้อมูลมาต่อกับ List ที่มีอยู่แล้วด้วย (:) เช่น
Prelude> 1:[]
[1]
เอา 1 ต่อกับ [] จะได้ List ที่มีสมาชิก 1 ตัวคือ 1
Prelude> 1:2:3:4:[]
[1,2,3,4]
เอา 4 ต่อกับ [] ได้ [4] เอา 3 ต่อ [4] ได้ [3,4] เอา 2 ต่อ [3,4] ได้ [2,3,4] และสุดท้าย 1 ต่อกับ [2,3,4] ได้ [1,2,3,4]
Pattern Matching
Pattern Matching คือเอาสามารถเอาข้อมูล 2 สิ่งมาวางทางด้านซ้าย และ ขวา ของเครื่องหมาย = เพื่อบอกว่าของทางด้านซ้าย เท่ากับของทางด้านขวา ถ้าของทางด้านซ้ายนั้นมีตัวแปรที่ไม่รู้ค่า Haskell จะกำหนดค่าให้ตัวแปรเหล่านั้นเพื่อให้ค่าเท่ากัน ตัวอย่างง่ายๆเช่นเราบอก
x = 10
แน่นอนว่า x มีค่าเท่ากับ 10
[x,y,z] = [1,2,3]
ถ้าเป็น List แล้วเราพยายาม matching ด้วย = สิ่งที่ Haskell พยายามทำคือ ทำให้ด้านซ้าย มีจำนวนสมาชิกเท่ากับด้านขวา และ สามาชิกทุกลำดับมีค่าเท่านั้น เช่นตัวอย่าง ค่า x จะเท่ากับ 1, y เท่ากับ 2 และ z เท่ากับ 3
ถ้าด้านซ้าย เราใช้ List ที่เขียนอยู่ในรูปแบบใช้ : เชื่อมต่อแต่ละสมาชิกแบบนี้
(x:xs) = [1,2,3]
Haskell ก็พยายามทำให้ด้านซ้าย เท่ากับด้านขวาเช่นกัน นั่นคือทำให้ x มีค่าเท่ากับ 1 และ xs เท่ากับ [2,3] เพราะ 1:[2,3] แล้วได้เท่ากับ [1,2,3] นั่นเอง
เราจึงมักเอา Pattern Matching เพื่อใช้แยกข้อมูลใน List ออกมาทีละ 1 และทำให้ได้ List ข้อมูลที่เหลือเอาไปใช้ต่อนั่นเอง
สรุป
เราได้เห็นวิธีการสร้าง List อีกวิธีไปแล้วคือใช้ (:) และเห็นการใช้ Pattern Matching เพื่อแกะข้อมูลใน List ออกมาและได้ส่วนที่เหลือ ไปแล้ว ซึ่งเป็นวิธีการที่สำคัญต่อไปเวลาเราเขียน Function เพื่อจัดการข้อมูลใน List