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