Haskell:
การพิมพ์ผลลัพธ์การแก้ไขโค้ด
วิธีการ:
วิธีง่ายๆ ในการพิมพ์ข้อมูลดีบักใน Haskell คือการใช้ฟังก์ชัน print, ซึ่งรับค่าที่เป็นอินสแตนซ์ของ typeclass Show และแสดงผลออกมาที่คอนโซล
main :: IO ()
main = do
let number = 42
print number
putStrLn "การดีบักใน Haskell เป็นเรื่องง่ายมาก!"
-- ผลลัพธ์:
-- 42
-- การดีบักใน Haskell เป็นเรื่องง่ายมาก!สำหรับโครงสร้างข้อมูลที่ซับซ้อนขึ้น, ให้แน่ใจว่ามีการ derive Show เพื่อให้สามารถพิมพ์ออกมาได้อย่างสวยงาม:
data Cake = Chocolate | Vanilla deriving Show
debugFlavor :: Cake -> IO ()
debugFlavor flavor = print flavor
main :: IO ()
main = debugFlavor Chocolate
-- ผลลัพธ์:
-- Chocolateบางครั้งเราต้องการการดีบักชั่วคราวที่สามารถลบออกได้ง่ายในภายหลัง อินเทอร์เฟซสำหรับสิ่งนี้คือโมดูล Debug.Trace.
import Debug.Trace (trace)
main :: IO ()
main = putStrLn $ trace "ข้อความนี้จะถูกพิมพ์ก่อน" "ข้อความนี้จะถูกพิมพ์หลัง"
-- ผลลัพธ์:
-- ข้อความนี้จะถูกพิมพ์ก่อน
-- ข้อความนี้จะถูกพิมพ์หลังฟังก์ชัน trace จะพิมพ์สตริงเมื่อค่าถูกประเมิน แต่เป็น side effect ในส่วนของโค้ดที่บริสุทธิ์ มันมีประโยชน์แต่ใช้ด้วยความระมัดระวัง!
การวิเคราะห์ลึก
ในยุคสมัยเก่า, การดีบักอาจเป็นเทคนิค “print statement” แบบเก่า Haskell เสนอสิ่งนี้ด้วยสัมผัสแบบฟังก์ชันและเครื่องมือสำหรับปฏิบัติการดีบักที่สะอาดขึ้น มาพบกับ print และโมดูล Debug.Trace ตามที่เราได้สำรวจไปแล้ว
สำหรับการใช้งานอะไรที่แตกต่างจาก print รวมถึง putStrLn สำหรับสตริงและ putStr, หากคุณไม่ชอบการเพิ่มบรรทัดใหม่โดยอัตโนมัติ โมดูล Debug.Trace ยังมีรูปแบบอื่นอย่าง traceShow ที่ทำงานโดยตรงกับอินสแตนซ์ของ Show, ทำให้คุณไม่ต้องใช้ฟังก์ชัน show
ในส่วนของรายละเอียดการประมวลผล, print โดยพื้นฐานคือ putStrLn . show มันพิมพ์ข้อมูลที่เป็น Show ออกมาใน stdout ฟังก์ชันของ Debug.Trace, ในทางกลับกัน, มีจุดประสงค์สำหรับการใช้ชั่วคราวในระหว่างการพัฒนา พวกมันแอบเข้าไปในโค้ดบริสุทธิ์และละเมิดความโปร่งใสในการอ้างอิงซึ่งเป็นสิ่งที่ไม่ควรทำในระยะยาว
อย่าลืมใช้ไลบรารีการล็อกสำหรับแอปพลิเคชันที่จริงจัง ซึ่งมอบการควบคุมมากขึ้นและการ “debug ด้วยการพิมพ์” น้อยลง
ดูเพิ่มเติม
- คู่มือเอกสารของ
Debug.Trace: https://hackage.haskell.org/package/base/docs/Debug-Trace.html - Haskell Wiki เกี่ยวกับการดีบัก: https://wiki.haskell.org/Debugging
- การสนทนาที่ดีเกี่ยวกับเหตุผลที่ไม่ควรใช้
Debug.Traceและสิ่งที่ควรทำแทน: https://stackoverflow.com/questions/7741400/why-is-using-debug-trace-considered-bad-practice