Nattawut Phetmak
Jack of all Trades
ค่าความจริงใน Haskell มีเพียงแค่ True
กับ False
เท่านั้น (ไม่สามารถใช้ 0
หรือค่าว่างแบบอื่นๆ แทน False
ได้)
ฟังก์ชันสำหรับตรวจสอบความเท่ากัน ใช้ ==
(เท่ากัน) กับ /=
(ไม่เท่ากัน) ส่วนฟังก์ชันสำหรับการตรวจสอบลำดับก็ได้แก่ <=
(น้อยกว่าเท่ากับ), <
(น้อยกว่า), >
(มากกว่า), >=
(มากกว่าเท่ากับ)
ghci> 1 == 1
True
ghci> 0 /= 42
True
logic สำหรับเชื่อมค่าความจริงเหล่านี้ได้แก่ &&
(และ), ||
(หรือ), not
(นิเสธ)
ghci> let x = 42
ghci> 1 < x && x <= 100
True
สาเหตุที่นิเสธไม่ใช้สัญลักษณ์เช่นเดียวกับการดำเนินการอื่นๆ เพราะฟังก์ชันใน Haskell จะเขียนแทนด้วยสัญลักษณ์ได้ มันต้องเป็นฟังก์ชัน 2 ตัวแปรและทำหน้าที่เป็น infix เท่านั้นครับ
ด้วยความที่เป็นภาษา functional ทุกๆ expression จะต้องคืนค่ากลับมาเสมอ ทำให้การใช้ if ใน Haskell ต้องมีส่วน else ตามท้ายตลอด
ghci> let x = -3.0
ghci> if x /= 0 then log (abs x) else 0
1.0986122886681098
ถ้าต้องการใช้แค่ if อย่างเดียว และบังคับโปรแกรมให้หยุดทำงานเมื่อเจอเงื่อนไขที่ผิด ก็สามารถใช้ฟังก์ชัน error
แบบนี้แทนได้
ghci> let x = 0.0
ghci> if x /= 0 then log (abs x) else error "log zero!"
*** Exception: log zero!
ตัวอย่างข้างต้นนี้สามารถแยกเขียนหลายบรรทัดให้อ่านง่ายขึ้นได้ แต่เนื่องจาก ghci
ไม่สะดวกเมื่อต้องเขียนหลายบรรทัด จะย้ายไปเขียนเป็นฟังก์ชันในไฟล์แทน ดังนี้
logAbs x = if x /= 0
then log (abs x)
else error "log zero!"
สิ่งที่ต่างไปจากการประกาศฟังก์ชันบน ghci
คือ ไม่ต้องมี let
นำหน้า เนื่องจากฟังก์ชันนี้ไม่ได้ถูกประกาศใน main
ครับ
เซฟเป็นไฟล์ func.hs
แล้วกลับมาที่ ghci
เราจะเรียกฟังก์ชันที่เขียนเก็บด้วยคำสั่ง :l
หรือ :load
ดังนี้
ghci> :l func.hs
[1 of 1] Compiling Main ( func.hs, interpreted )
Ok, modules loaded: Main.
ghci> logAbs (-3)
1.0986122886681098