Nattawut Phetmak
Jack of all Trades
การสร้าง List
ใน Haskell โดยพื้นฐานก็จะมีหน้าตาคล้ายภาษาขั้นสูงทั่วไป คือใช้วงเล็บปีกแข็งครอบสมาชิกไว้เช่นนี้
ghci> [1,2,3]
[1,2,3]
ghci> ['h','e','l','l','o']
"hello"
อย่างไรก็ตาม สมาชิกใน List
ทุกตัวต้องเป็น type เดียวกันเท่านั้น เช่นเดียวกับ String
ที่มีสมาชิกทุกตัวเป็น Char
นั่นเอง
การเพิ่มสมาชิกให้ List
นอกจากจะทำผ่าน ++
ได้แล้ว ยังสามารถทำผ่าน :
ได้อีกด้วย โดยฝั่งซ้ายของ :
คือสมาชิกที่จะเพิ่ม และฝั่งขวาคือ List
ตั้งต้น ผลลัพท์จะเป็น List
ตั้งต้นที่มีสามาชิกใหม่ด้านหัว
ghci> 1:[]
[1]
ghci> 4:[8,15,16,23,42]
[4,8,15,16,23,42]
ghci> 'h':'e':'l':'l':'o':[]
"hello"
List
ใน Haskell นั้น แท้จริงแล้วถูกออกแบบมาเป็น stack โดยด้านที่รับ-ส่งสมาชิกคือด้านหัว (ฝั่งซ้ายมือ) ดังนั้นเรามักจะเพิ่มสมาชิกตัวใหม่ๆ โดย :
มากกว่าที่จะใช้ ++
เพิ่มสมาชิกต่อหลังครับ (มีผลต่อความเร็ว)
เมื่อต้องการดึงหัว List
ออกมาใช้ ทำได้โดยฟังก์ชัน head
หรือเก็บสมาชิกทุกตัวยกเว้นหัวก็ใช้ tail
ghci> head "hello"
'h'
ghci> tail "hello"
"ello"
แม้เราจะไม่ค่อยยุ่งกับสมาชิกตัวท้ายสุดซักเท่าไหร่ แต่ถ้าต้องการสมาชิกตัวสุดท้าย หรือต้องการสมาชิกทุกตัวยกเว้นท้ายสุด ก็สามาถทำได้ผ่าน last
, init
ตามลำดับ
ghci> last [4,8,15,16,23,42]
42
ghci> init [4,8,15,16,23,42]
[4,8,15,16,23]
ข้อควรระวังคือการดำเนินการพวกนี้ ไม่สามารถทำได้กับ List
ที่ไม่มีสมาชิกเลย ซึ่งเราสามารถตรวจว่ามีสมาชิกหรือไม่ได้โดยคำสั่ง null
ghci> null ""
True
ส่วนการดึงสมาชิก ณ ตำแหน่งใดๆ ออกมา ทำได้ผ่านเครื่องหมาย !!
เช่นนี้ครับ
ghci> [4,8,15,16,23,42] !! 0
4
ghci> [4,8,15,16,23,42] !! 5
42
แน่นอนว่ามันจะให้ error ถ้าส่วน index นั้นใหญ่เกินกว่า List
เราสามารถหาขนาดได้โดยฟังก์ชัน length
ghci> length [4,8,15,16,23,42]
6
ghci> length []
0
ส่วนถ้าจะตรวจสอบว่ามีสมาชิกที่เราอยากรู้อยู่ใน List
นั้นหรือเปล่า ก็ทำได้ผ่านฟังก์ชัน elem
ghci> 13 `elem` [4,8,15,16,23,42]
False