# การใช้งาน Nested Loop ในภาษา Haskell และการประยุกต์ใช้ในโลกจริง
ภาษา Haskell เป็นภาษาโปรแกรมที่มีความเป็น Functional Programming ที่แตกต่างอย่างมากจาก Imperative Programming ที่หลายๆ คนเคยชินกัน เมื่อพูดถึงลูป (loop) ในการเขียนโปรแกรมแบบฟังก์ชันนั้น มันอาจทำให้หลายคนสงสัยว่าจะใช้งานได้อย่างไรในภาษาที่ไม่มีโครงสร้างการวนซ้ำแบบดั้งเดิม เช่น for หรือ while แต่ถึงอย่างนั้น Haskell ก็มีเครื่องมือที่ใช้ในการจัดการกับปัญหาที่ต้องการการวนซ้ำ นั่นคือการใช้ฟังก์ชันแบบ recursive และการใช้ higher-order functions เช่น map, fold, และ filter
ในภาษา Haskell, ไม่มีคำสั่ง loop แบบที่เราเห็นในภาษาอื่นๆ การทำ nested loop จึงต้องอาศัยเทคนิคการเขียนฟังก์ชันให้เรียกใช้ตัวมันเอง (recursion) หรือการใช้ฟังก์ชันจากไลบรารี, โดยที่ทั้งสองวิธีนี้ล้วนแต่รักษาแนวคิดของ pure functions ที่ไม่มี side-effects
ในส่วนนี้ เราจะมาดูการใช้ nested loop ผ่านการซ้อนกันของฟังก์ชัน map ที่สามารถทำหน้าที่แทน loop ในภาษาอื่นๆ
ตัวอย่างโค้ดที่ 1: การคูณเลขสองตัว
ตัวอย่างการใช้ nested map เพื่อคูณเลขสองตัวจากสองลิสต์:
multiplyList :: [Int] -> [Int] -> [Int]
multiplyList xs ys = concatMap (\x -> map (*x) ys) xs
main :: IO ()
main = print (multiplyList [1,2,3] [4,5,6])
เมื่อรันโปรแกรมนี้ผลลัพธ์ที่ได้จะเป็น:
[4,5,6,8,10,12,12,15,18]
เราใช้ `concatMap` ซึ่งเป็นการผสานการทำ map และ concat เข้าด้วยกัน เพื่อการประมวลผลแต่ละตัวในลิสต์แรก (xs) และให้ผลลัพธ์ที่เป็นการคูณกับทุกตัวในลิสต์ที่สอง (ys)
ตัวอย่างโค้ดที่ 2: การสร้างตารางสองมิติ
ตัวอย่างการสร้างตารางสองมิติด้วยฟังก์ชัน map ภายนอกและภายใน:
createTable :: Int -> Int -> [[Int]]
createTable rows cols = map (\row -> map (\col -> row * col) [1..cols]) [1..rows]
main :: IO ()
main = print (createTable 3 3)
เมื่อรันโปรแกรมนี้ผลลัพธ์ที่ได้จะเป็น:
[[1,2,3],[2,4,6],[3,6,9]]
การใช้ map แบบซ้อนกันทำให้เราสามารถสร้างข้อมูลในรูปแบบตารางแบบสองมิติได้
ตัวอย่างโค้ดที่ 3: การกรองค่าจากลิสต์สองมิติ
ตัวอย่างการใช้ filter และ map เพื่อกรองและแปลงลิสต์สองมิติ:
filterAndTransform :: [[Int]] -> Int -> [[Int]]
filterAndTransform table threshold = map (filter (> threshold)) table
main :: IO ()
main = print (filterAndTransform [[1,2,3],[4,5,6],[7,8,9]] 5)
ผลลัพธ์ที่ได้จะเป็น:
[[],[6],[7,8,9]]
ในตัวอย่างนี้เรากรองค่าที่มากกว่าเกณฑ์ที่กำหนด (threshold) ออกจากลิสต์ย่อยแต่ละลิสต์
ประยุกต์ใช้ Nested Loop ใน Haskell สามารถใช้ในการจัดการกับข้อมูลที่มีความซับซ้อน เช่น การทำ data analysis, การจัดการกับฐานข้อมูลรูปแบบตาราง, และการประมวลผลข้อมูลที่อาศัยการคำนวณหลายชั้น เช่นในทางด้าน Data Science และ Machine Learning
ในการจัดการกับปัญหาเหล่านี้ การมีพื้นฐานที่ดีใน Haskell และการเข้าใจในการใช้ฟังก์ชัน high-order เป็นสิ่งสำคัญที่จะทำให้การเขียนโค้ดมีประสิทธิภาพและง่ายต่อการบำรุงรักษา
ที่ EPT หรือ Expert-Programming-Tutor พวกเรายินดีที่จะเป็นส่วนหนึ่งในการเดินทางทางด้านการเรียนรู้การเขียนโปรแกรมในด้านภาษา Haskell และเทคนิคการโปรแกรมแบบฟังก์ชันนัลที่ทันสมัยพร้อมด้วยการประยุกต์ใช้ในโลกจริง หากคุณอยากรู้ว่าภาษา Haskell สามารถช่วยให้คุณแก้ปัญหาในโลกแห่งการเขียนโค้ดได้อย่างไร มาร่วมค้นหากับเราที่ EPT วันนี้!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
Tag ที่น่าสนใจ: haskell functional_programming nested_loop recursion higher-order_functions map_function filter_function data_analysis data_science machine_learning pure_functions
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM