คำถามนี้เป็นคำถามเชิงทฤษฎีเกี่ยวกับฟังก์ชั่นของ 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
ซึ่งให้รูปแบบที่คุณสนใจ