หน้านี้เป็นการบ้านโปรแกรมที่หนึ่งของ[[:204435-52|วิชา 204435]] ===== 1. เขียนฟังก์ชัน ''mylast'' ที่คืนค่าสมาชิกตัวสุดท้ายของลิสต์ ===== Main> mylast [1,2,3,4] 4 Main> mylast [1,2,3,4,5] 5 ===== 2. Higher order functions ===== เราสามารถเขียนระบุ "ฟังก์ชัน" ใน Haskell ได้ในลักษณะเดียวกับการเขียนค่าทั่วไป (นั่นคือไม่ต้องระบุ "ชื่อ" ของฟังก์ชันนั้น) โดยใช้ lambda ยกตัวอย่างเช่น ฟังก์ชันที่รับค่า ''x'' แล้วคืนค่า ''x+1'' สามารถเขียนได้ดังนี้ \x -> x+1 ดังนั้นเราสามารถเรียกฟังก์ชันดังกล่าวได้ เช่น Main> (\x -> x+1) 5 6 รูปแบบการเขียนดังกล่าวคือ \ชี่อตัวแปร -> ค่าของฟังก์ชัน ถ้าต้องการฟังก์ชันที่รับหลายตัวแปร เราสามารถเขียนเช่น \x -> \y -> x + y ซึ่งเป็นการนิยามฟังก์ชันบวกจำนวนสองจำนวน การเขียนดังกล่าว เป็นการระบุฟังก์ชันโดยไม่ระบุชื่อ ด้วยวิธีการเขียนดังกล่าว เราสามารถนิยามฟังก์ชัน ''compose'' ที่รับฟังก์ชัน ''f'' และ ''g'' แล้วคือฟังก์ชัน ''f o g'' ได้ดังนี้ compose f g = \x -> (f (g x)) a. จงหาผลลัพธ์ของนิพจน์ต่อไปนี้ ''compose (\x -> x+1) (\x -> x*2) 10'' b. (สำหรับข้อนี้สามารถดูแบบฝึกหัดท้ายบท 3.4 ประกอบ) เขียนฟังก์ชัน ''mapcar'' ที่รับฟังก์ชัน ''f'' และลิสต์ จากนั้นคืนค่าลิสต์ที่มีสมาชิกเป็นผลลัพธ์จากการ apply ''f'' เข้ากับสมาชิกทุกตัวของลิสต์ที่รับมา เช่น Main> mapcar (\x -> x+1) [1,2,3,4] [2,3,4,5] c. เขียนฟังก์ชัน ''myfilter'' ที่รับฟังก์ชัน ''f'' สำหรับเลือกสมาชิก และลิสต์ ''L'' จากนั้น คือลิสต์ที่ประกอบไปด้วยสมาชิกที่ฟังก์ชัน ''f'' คืนค่าจริง (ผ่านการทดสอบจาก ''f'') Main> myfilter (\x -> (x > 10)) [1,3,5,11,14,9,12] [11,14,12] ===== 3. ''foldr'' ===== ฟังก์ชัน ''foldr'' เป็นหนึ่งใน higher-order function ที่มีประโยชน์มาก นิยามของฟังก์ชันดังกล่าวเป็นดังนี้ foldr :: (a -> b -> b) -> b -> [a] -> b foldr f v [] = v foldr f v (x:xs) = f x (foldr v xs) เราสามารถทำความเข้าใจกับฟังก์ชันดังกล่าวโดยพิจารณาจากตัวอย่าง ถ้าเรียก ''foldr f v [1,2,3]'' ผลที่ได้จะเหมือนกับการสั่ง ''(f 1 (f 2 (f 3 v)))'' เราสามารถหาผลรวมของลิสต์ได้โดยสั่ง Main> foldr (+) 0 [1,2,3,4,5] 15 นั่นคือจะมีผลเหมือนกับสั่ง ''(+ 1 (+ 2 (+ 3 (+ 4 (+ 5 0)))))'' สังเกตว่าเราสามารถนิยามฟังก์ชัน ''newsum'' ที่หาผลรวมของสมาชิกในลิสต์ได้ดังนี้ newsum :: (Num a) => [a] -> a newsum x = foldr (+) 0 x a. นิยามฟังก์ชัน ''mapcar'' โดยใช้ฟังก์ชัน ''foldr'' b. นิยามฟังก์ชัน ''myfilter'' โดยใช้ฟังก์ชัน ''foldr''