List

การสร้าง 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

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus