ทำไมสิ่งเหล่านี้จึงไม่เทียบเท่ากัน
show $ if someCondition then someInt else some double
และ
if someCondition then show someInt else show someDouble
ฉันเข้าใจว่าถ้าคุณแยกif ... else
ส่วนในตัวอย่างแรกให้กับนิพจน์ด้วยตัวเองคุณจะไม่สามารถแสดงประเภทของมันด้วยประเภทผลรวมนิรนามชนิดของInt | Double
สิ่งที่คุณสามารถทำได้อย่างง่ายดายใน TypeScript (กล่าวถึง TypeScript เพราะมันเป็น langauge ผมใช้บ่อยและประเภทสนับสนุนซำ) และจะต้องหันไปใช้ข้อมูลนั้นขึ้นอยู่กับว่ามันจะเรียกEither
show
ตัวอย่างที่ฉันให้ที่นี่มีความสำคัญ แต่สำหรับฉันมันสมเหตุสมผลมากกว่าที่จะคิดว่า "โอเคเรากำลังจะแสดงบางสิ่งบางอย่างและสิ่งนั้นขึ้นอยู่กับ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
คุณสามารถเห็นมันเป็นผู้ประกอบการที่ประกอบไปด้วยสามภาษาการเขียนโปรแกรม