คำถามนี้เป็นคำถามเชิงทฤษฎีเกี่ยวกับฟังก์ชั่นของ Haskell ซึ่งสามารถโต้แย้งได้ทุกประเภท มีความแตกต่างระหว่างวิธีการทำงานกับลายเซ็นประเภทของหรือไม่
a -> b -> a
และ
c -> a -> c
มีการยกตัวอย่าง? ความช่วยเหลือใด ๆ ที่ชื่นชม
คำถามนี้เป็นคำถามเชิงทฤษฎีเกี่ยวกับฟังก์ชั่นของ Haskell ซึ่งสามารถโต้แย้งได้ทุกประเภท มีความแตกต่างระหว่างวิธีการทำงานกับลายเซ็นประเภทของหรือไม่
a -> b -> a
และ
c -> a -> c
มีการยกตัวอย่าง? ความช่วยเหลือใด ๆ ที่ชื่นชม
คำตอบ:
ไม่มีความแตกต่าง ตั้งแต่a, bและcเริ่มต้นด้วยตัวพิมพ์เล็กเหล่านี้เป็นตัวแปร คุณสามารถเปลี่ยนชื่อตัวแปรและสิ่งนี้จะยังคงเหมือนเดิมตราบใดที่ตัวแปรสองตัว (หรือมากกว่า) ไม่ได้ " ปะทะกัน "
การปะทะดังกล่าวสามารถเกิดขึ้นได้หากคุณเปลี่ยนชื่อตัวแปรที่มีชื่อเดียวกันกับตัวแปรอื่นหรือเมื่อคุณเปลี่ยนชื่อตัวแปรสองตัว (หรือมากกว่า) เป็นชื่อใหม่เดียวกัน หากคุณจะเปลี่ยนชื่อตัวแปรaเป็นตัวอย่างbในส่วนแรกของโค้ดเราจะได้รับb -> b -> bแต่ไม่เหมือนกันเนื่องจากเราบังคับใช้พารามิเตอร์ตัวแรกและตัวที่สองเป็นประเภทเดียวกัน ในขณะที่ลายเซ็นประเภทของคุณเรามีอิสระที่จะเลือกสองประเภทที่เหมือนกัน แต่ไม่จำเป็น
Nope คิดว่าเป็นa -> b -> a This Type -> Another Type -> This Typeจากนั้นทั้งคู่พอดีกับรูปแบบที่กำหนด อย่างไรก็ตามสิ่งที่ชอบa -> b -> cไม่พอดี: This Type -> That Type -> Yet Another Typeแตกต่างกัน (โดยทั่วไป); ยกเว้นกรณีขอบเมื่อc = aซึ่งให้รูปแบบที่คุณสนใจ