ทำไมสิ่งเหล่านี้จึงไม่เทียบเท่ากัน
show $ if someCondition then someInt else some double
และ
if someCondition then show someInt else show someDouble
ฉันเข้าใจว่าถ้าคุณแยกif ... elseส่วนในตัวอย่างแรกให้กับนิพจน์ด้วยตัวเองคุณจะไม่สามารถแสดงประเภทของมันด้วยประเภทผลรวมนิรนามชนิดของInt | Doubleสิ่งที่คุณสามารถทำได้อย่างง่ายดายใน TypeScript (กล่าวถึง TypeScript เพราะมันเป็น langauge ผมใช้บ่อยและประเภทสนับสนุนซำ) และจะต้องหันไปใช้ข้อมูลนั้นขึ้นอยู่กับว่ามันจะเรียกEithershow
ตัวอย่างที่ฉันให้ที่นี่มีความสำคัญ แต่สำหรับฉันมันสมเหตุสมผลมากกว่าที่จะคิดว่า "โอเคเรากำลังจะแสดงบางสิ่งบางอย่างและสิ่งนั้นขึ้นอยู่กับsomeCondition" มากกว่า "โอเคถ้ามีเงื่อนไขจริงแล้วแสดงบางอย่าง สำหรับการทำซ้ำรหัสน้อย (ที่นี่แสดงซ้ำสองครั้ง แต่มันอาจจะเป็นฟังก์ชั่นการใช้งานที่ยาวนานและแทนที่จะif ... elseมี> 2 สาขาที่ต้องพิจารณา)
ในใจของฉันมันควรจะง่ายสำหรับคอมไพเลอร์เพื่อตรวจสอบว่าแต่ละประเภทที่ทำให้ผลรวมประเภท (ที่นี่Int | Double) สามารถใช้เป็นพารามิเตอร์ในการshowทำงานและตัดสินใจว่าประเภทถูกต้องหรือไม่ ยิ่งไปกว่านั้นshowฟังก์ชั่นนั้นจะส่งคืนstringชนิดพารามิเตอร์เสมอดังนั้นคอมไพเลอร์ไม่จำเป็นต้องดำเนินการกับ "สาขา" ที่เป็นไปได้ทั้งหมด (ดังนั้นประเภทที่เป็นไปได้ทั้งหมด)
โดยการเลือกว่าคุณสมบัติดังกล่าวไม่ได้อยู่? หรือฉันคิดว่าการนำมันไปใช้ยากขึ้น?
making all conversions explicitผมเห็นด้วยเกี่ยวกับ ในคำถามของฉันฉันไม่ต้องการให้ Haskell ส่งIntไปDoubleหรือกลับกัน ฉันเพิ่งใช้ทั้งสองประเภทเป็นตัวอย่าง คุณสามารถเปลี่ยนทุกIntที่มีaและDoubleที่มีในคำถามของฉันที่ได้รับมาทั้งสองประเภทb Showฉันเข้าใจว่าไม่มีanonymous sum typesใน Haskell แต่ฉันอยากจะรู้ว่าทำไมเป็นเช่นนั้นและอะไรที่ทำให้เราไม่สามารถออกแบบภาษาให้มีได้
x :: Int | Boolและเราต้องคอมไพล์show xก็ไม่มีวิธีที่ง่ายที่จะรู้ว่าตัวชี้ไปยังฟังก์ชันใดที่จะใช้สำหรับการโทรshowใน RTS แบบลบประเภท เราอาจต้องเก็บข้อมูลระดับประเภทไว้ที่รันไทม์
(String, Int)ไม่ระบุชื่อ มันเป็นเพียงประเภทผลิตภัณฑ์ปกติที่มีไวยากรณ์ตลก (String | Int)จะแตกต่างกันมากทั้ง เริ่มต้นด้วยการถามตัวเองว่า(Int|Int)ควรจะเหมือนกันIntและทำไม
if ... then ... else ...จำเป็นต้องมีประเภทเดียวกันในส่วนthenและelseคุณสามารถเห็นมันเป็นผู้ประกอบการที่ประกอบไปด้วยสามภาษาการเขียนโปรแกรม