Haskell:
การจัดการกับข้อผิดพลาด
วิธีการ:
Haskell จัดการข้อผิดพลาดอย่างมีประสิทธิภาพโดยใช้ประเภทเช่น Maybe
และ Either
นี่คือการดูอย่างรวดเร็ว:
safeDivide :: Integral a => a -> a -> Maybe a
safeDivide _ 0 = Nothing -- การหารด้วยศูนย์ไม่ได้ ดังนั้นเราจึงคืนค่า Nothing
safeDivide x y = Just (x `div` y) -- ไม่เช่นนั้น เราก็โอเค คืนผลลัพธ์ใน Just
-- ลองดูการทำงาน:
example1 :: Maybe Int
example1 = safeDivide 10 2 -- Just 5
example2 :: Maybe Int
example2 = safeDivide 10 0 -- Nothing
สำหรับการจัดการข้อผิดพลาดที่ซับซ้อนมากขึ้น Either
มาใช้:
safeDivideEither :: Integral a => a -> a -> Either String a
safeDivideEither _ 0 = Left "Divide by zero error." -- คราวนี้ ข้อผิดพลาดมาพร้อมข้อความ
safeDivideEither x y = Right (x `div` y)
-- และเมื่อใช้:
example3 :: Either String Int
example3 = safeDivideEither 10 2 -- Right 5
example4 :: Either String Int
example4 = safeDivideEither 10 0 -- Left "Divide by zero error."
การศึกษาลงลึก
ในโลกของ Haskell, การจัดการกับข้อผิดพลาดมีประวัติอันยาวนาน เมื่อวันก่อน ข้อผิดพลาดอาจทำให้โปรแกรมทั้งหมดของคุณล่ม—ไม่สนุกเลย Haskell มีระบบประเภทที่นำเสนอวิธีการทำให้สิ่งนี้เกิดขึ้นน้อยลงอย่างมาก เรามี Maybe
และ Either
, แต่ยังมีอื่นๆ เช่น Exceptions
และ IO
สำหรับสถานการณ์ที่แตกต่างกัน
Maybe
มันง่าย: คุณจะได้ Just
บางอย่างถ้าทุกอย่างเป็นไปด้วยดี หรือ Nothing
ถ้าไม่ใช่ Either
ก้าวขึ้นมาอีกขั้น อนุญาตให้คุณคืนค่าข้อความข้อผิดพลาด (Left
) หรือผลลัพธ์ที่ประสบความสำเร็จ (Right
)
ทั้งคู่เป็น Pure, หมายความว่าพวกเขาไม่จัดการกับโลกภายนอก - ซึ่งถือเป็นเรื่องใหญ่ใน Haskell เราหลีกเลี่ยงข้อบกพร่องของการข้อยกเว้นที่ไม่ได้ตรวจสอบซึ่งทำให้ภาษาอื่นๆ ต้องทุกข์ทรมาน
สำหรับผู้ที่ไม่พอใจกับ Maybe
และ Either
, ไลบรารีเช่น Control.Exception
ให้การจัดการข้อผิดพลาดแบบอิมพีเรียล สไตล์โดยใช้การข้อยกเว้น แต่การใช้มันในระดับที่สูงเกินไปอาจทำให้สิ่งต่างๆ ซับซ้อน ดังนั้นชุมชนจึงมักจะยึดติดกับประเภทเหล่านั้น
ดูเพิ่มเติม
ศึกษาลึกซึ้งยิ่งขึ้นกับ:
- เอกสารของ Haskell เอง: Haskell
- เหมาะสำหรับผู้เริ่มต้น: “Learn You a Haskell for Great Good!”