Haskell Data Type Part 2 Record Syntax

ตอนที่แล้ว Part 1 ได้พูดถึงการสร้าง Type ใหม่, การสร้าง Value ของ Type นั้น และ การสร้าง function เพื่อดึงค่าข้อมูลแต่ละ field ของ Type กันไปแล้ว จะเห็นว่าต้องสร้าง function แล้วใช้ Pattern Matching เพื่อ matching ข้อมูลแต่ละ field ซึ่งโค้ดค่อนข้างเยอะ วันนี้เราจะมาดู syntax อีกแบบที่ช่วยให้เราสร้าง Type และได้ function Accessor พร้อมกันเลย

Record Syntax

เมื่อวานเวลาสร้าง Type เราสร้างแบบนี้

data Customer = Customer String String Int deriving(Show)

ซึ่งค่า String String Int แทน ชื่อ นามสกุล อายุ ตามลำดับ เวลาอ่านจากการกำหนด Type นี่เราจะไม่รู้ว่าแต่ละตำแหน่งแทนอะไรเลย อาจจะแก้ได้โดยเขียน comment หรือสร้าง Accessor function เอาไว้ใกล้ๆ

แต่ถ้าเราใช้ Record Syntax ที่สร้าง Type เก็บข้อมูลแบบเดียวกัน เราจะเห็นได้ชัดเจนกว่าว่าแต่ละ Field เก็บข้อมูลอะไร ลองดู Customer Type แบบ Record Syntax แบบนี้

data Customer = Customer { customerFirstName :: String
, customerLastName :: String
, customerAge :: Int
} deriving (Show)

เราสามารถสร้าง Value ของ Customer ด้วย Data Constructor เช่นกัน แต่พิเศษกว่าหน่อยตรงใช้ {} และชื่อ field มาช่วยทำให้อ่านง่ายขึ้นได้เช่น

cust1 = Customer { customerFirstName = “Weerasak”
, customerLastName = “Chongnguluam”
, customerAge = 30
}

เราไม่จำเป็นต้องสร้าง Accessor Function เองแล้วเพราะชื่อ Field นั้นคือชื่อ Accessor Function ด้วย ลองเล่นดูแบบนี้

λ> customerFirstName cust1
“Weerasak”
λ> customerLastName cust1
“Chongnguluam”
λ> customerAge cust1
30

เราสามารถสร้าง Value ใหม่โดยการดัดแปลงค่าบาง field ของค่าเดิมที่มีอยู่แล้วได้ เช่น

cust2 = cust1 { customerAge = 31 }
λ> customerFirstName cust2
“Weerasak”
λ> customerLastName cust2
“Chongnguluam”
λ> customerAge cust2
31

สรุป

วันนี้ได้เรียนรู้วิธีสร้าง Data Type ใหม่อีกแบบโดยใช้ Record Syntax ซึ่งทำให้เราอ่านโค้ดง่าย และ ไม่ต้องเขียน Accessor Function เอง ซึ่งหลายๆ Library ก็ใช้วิธีการนี้ ตอนต่อไปจะว่าด้วยรูปแบบ Data Type อีกแบบ ที่เรียกว่า Sum Type