เหตุใด Haskell จึงมี built-in if/then/else
ซึ่งขึ้นอยู่กับBool
ชนิดแทนที่จะมีฟังก์ชันไลบรารีอย่างง่าย เช่น
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
เหตุใด Haskell จึงมี built-in if/then/else
ซึ่งขึ้นอยู่กับBool
ชนิดแทนที่จะมีฟังก์ชันไลบรารีอย่างง่าย เช่น
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
คำตอบ:
มันหมดจดสำหรับน้ำตาลที่ดีของif
, then
และelse
คำหลัก; ในความเป็นจริง GHC ( RebindableSyntax
เปิดใช้งานส่วนขยาย) จะยกเลิกการสร้างไวยากรณ์โดยเพียงแค่เรียกifThenElse
ใช้ฟังก์ชันใดก็ตามที่อยู่ในขอบเขต
มันไม่สำคัญหรอก ... สำหรับฉันมันดูเหมือนว่าถ้า / แล้ว / อย่างอื่นไม่ได้ใช้บ่อยในทุกวันนี้ ฉันพบว่าตัวเองกำลังเขียนรูปแบบยามถ้า .. แล้ว .. อื่น
อย่างไรก็ตามจากมุมมองทางวากยสัมพันธ์มันเป็นเรื่องดีที่มี
if expr1 then expr2 else expr3
ดังนั้นคุณสามารถเขียน
if foo a then bar b else baz c
แทน
if (foo a) (bar b) (baz c)
ซึ่งดูเล็กน้อยเกินไป LISPish สำหรับฉัน
สำหรับการวิเคราะห์ความหมายและการสร้างรหัสมันเป็นเรื่องดีที่มีโครงสร้างนี้ซึ่งสามารถรวบรวมได้อย่างง่ายดายกับรหัสเครื่องที่มีประสิทธิภาพ โปรดทราบว่ารหัสสามารถข้ามส่วนที่ทำให้ thunk สำหรับสาขาที่ไม่สามารถเข้าถึงได้ซึ่งตรงข้ามกับการเรียกใช้ฟังก์ชันโดยที่พารามิเตอร์ (ไม่ได้ประเมินค่า) จะต้องถูกส่งผ่านทั้งหมด แต่ก็ต้องเสียเวลา (และหน่วยความจำซึ่งจะต้องเรียกคืนในภายหลัง) เพื่อสร้าง thunk เพื่อทำให้ดีในเรื่องนี้เราจะต้อง inline ถ้าฟังก์ชั่นทุกที่