Haskell List part 4 List Pattern Matching

Weerasak Chongnguluam
1 min readMar 15, 2016

--

สามตอนที่แล้ว เราได้เห็นแล้วว่า 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

--

--