มีความแตกต่างระหว่างลายเซ็นประเภท a -> b -> a และ c -> a -> c หรือไม่


16

คำถามนี้เป็นคำถามเชิงทฤษฎีเกี่ยวกับฟังก์ชั่นของ Haskell ซึ่งสามารถโต้แย้งได้ทุกประเภท มีความแตกต่างระหว่างวิธีการทำงานกับลายเซ็นประเภทของหรือไม่

a -> b -> a 

และ

c -> a -> c 

มีการยกตัวอย่าง? ความช่วยเหลือใด ๆ ที่ชื่นชม


6
ไม่มีคุณเพียงแค่เปลี่ยนชื่อของชนิดของตัวแปร ตราบใดที่คุณไม่เปลี่ยนชื่อตัวแปรเป็นตัวแปรอื่น (เช่นมีการปะทะกันของชื่อ) ก็ไม่มีปัญหา
Willem Van Onsem

ขึ้นอยู่กับว่า / ชนิดตัวแปรถูกผูกไว้ที่อื่น
Bergi

คำตอบ:


17

ไม่มีความแตกต่าง ตั้งแต่a, bและcเริ่มต้นด้วยตัวพิมพ์เล็กเหล่านี้เป็นตัวแปร คุณสามารถเปลี่ยนชื่อตัวแปรและสิ่งนี้จะยังคงเหมือนเดิมตราบใดที่ตัวแปรสองตัว (หรือมากกว่า) ไม่ได้ " ปะทะกัน "

การปะทะดังกล่าวสามารถเกิดขึ้นได้หากคุณเปลี่ยนชื่อตัวแปรที่มีชื่อเดียวกันกับตัวแปรอื่นหรือเมื่อคุณเปลี่ยนชื่อตัวแปรสองตัว (หรือมากกว่า) เป็นชื่อใหม่เดียวกัน หากคุณจะเปลี่ยนชื่อตัวแปรaเป็นตัวอย่างbในส่วนแรกของโค้ดเราจะได้รับb -> b -> bแต่ไม่เหมือนกันเนื่องจากเราบังคับใช้พารามิเตอร์ตัวแรกและตัวที่สองเป็นประเภทเดียวกัน ในขณะที่ลายเซ็นประเภทของคุณเรามีอิสระที่จะเลือกสองประเภทที่เหมือนกัน แต่ไม่จำเป็น


16

Nope คิดว่าเป็นa -> b -> a This Type -> Another Type -> This Typeจากนั้นทั้งคู่พอดีกับรูปแบบที่กำหนด อย่างไรก็ตามสิ่งที่ชอบa -> b -> cไม่พอดี: This Type -> That Type -> Yet Another Typeแตกต่างกัน (โดยทั่วไป); ยกเว้นกรณีขอบเมื่อc = aซึ่งให้รูปแบบที่คุณสนใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.