ทำไม Haskell มี built-in“ if / then / else” แทนที่จะกำหนดเป็นฟังก์ชั่นไลบรารีแบบง่าย ๆ ?


25

เหตุใด Haskell จึงมี built-in if/then/elseซึ่งขึ้นอยู่กับBoolชนิดแทนที่จะมีฟังก์ชันไลบรารีอย่างง่าย เช่น

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y

4
ฉันเดาว่าพวกเขาต้องการไวยากรณ์ if / then / else ที่พวกเขาไม่สามารถรับได้หากไม่มีฟังก์ชัน mixfix เหมือนที่มีใน agda ฟังก์ชั่นที่คุณอ้างถึงมีโครงสร้างเป็นไตรภาคซึ่งคุณสามารถนำไปใช้เองได้แม้ว่าฉันจะเข้าใจว่าพวกเขาให้เราถ้า / แล้ว / อย่างอื่นน้ำตาล (มันน่าจะเป็นแค่น้ำตาลมากกว่ากรณี) เพียงเพราะพวกเขาทำได้ เพื่อสำรองฉันที่นี่ซึ่งเป็นเหตุผลที่ฉันเขียนสิ่งนี้ในความคิดเห็น
จิมมี่ฮอฟฟา

10
สิ่งนี้อาจเห็นได้ชัดเจนสำหรับผู้อ่านส่วนใหญ่ แต่ฉันอยากจะชี้ให้เห็นว่าการมีîf / then / else เป็นฟังก์ชั่นจะไม่เป็นทางออกที่ดีในภาษาที่กระตือรือร้น (เช่นแบบแผนหรือ sml) ในขณะที่มันสมเหตุสมผล ภาษาเช่น Haskell
Giorgio

คำตอบ:


24

มันหมดจดสำหรับน้ำตาลที่ดีของif, thenและelseคำหลัก; ในความเป็นจริง GHC ( RebindableSyntaxเปิดใช้งานส่วนขยาย) จะยกเลิกการสร้างไวยากรณ์โดยเพียงแค่เรียกifThenElseใช้ฟังก์ชันใดก็ตามที่อยู่ในขอบเขต


6

มันไม่สำคัญหรอก ... สำหรับฉันมันดูเหมือนว่าถ้า / แล้ว / อย่างอื่นไม่ได้ใช้บ่อยในทุกวันนี้ ฉันพบว่าตัวเองกำลังเขียนรูปแบบยามถ้า .. แล้ว .. อื่น

อย่างไรก็ตามจากมุมมองทางวากยสัมพันธ์มันเป็นเรื่องดีที่มี

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 ถ้าฟังก์ชั่นทุกที่


3
ฉันไม่คิดว่าการทำอินไลน์เป็นปัญหาจริง ความเข้าใจของฉันคือ GHC นั้นยอดเยี่ยมอยู่แล้วในการทำหน้าที่เล็ก ๆ น้อย ๆ เพราะมันเป็นรูปแบบทั่วไปใน Haskell
Tikhon Jelvis

1
@TikhonJelvis แน่นอน แต่ด้วย if / then / else คุณไม่จำเป็นต้องมีฟังก์ชั่นพิเศษที่จะต้องมีการแทรกอยู่เสมอ คุณไม่จำเป็นต้องมีรหัสผ่านแบบอินไลน์และยังสามารถสร้างรหัสที่เหมาะสมได้ ไม่ใช่ทุกคนในโลกที่จะเป็น GHC
Ingo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.