ใน ghci เมื่อฉันพิมพ์
:t (-)
เพื่อหาประเภทของ(-)มันจะกลับมา
(-) :: Num a => a -> a -> a
แต่เมื่อผมเขียน-1Haskell ผลตอบแทนจำนวนซึ่งดูเหมือนว่าจะบ่งบอกว่าเป็นประเภท(-) Num a => a -> aวิธีการสามารถ(-)ดูเหมือนจะมีสองชนิดแตกต่างกันอย่างไร
ใน ghci เมื่อฉันพิมพ์
:t (-)
เพื่อหาประเภทของ(-)มันจะกลับมา
(-) :: Num a => a -> a -> a
แต่เมื่อผมเขียน-1Haskell ผลตอบแทนจำนวนซึ่งดูเหมือนว่าจะบ่งบอกว่าเป็นประเภท(-) Num a => a -> aวิธีการสามารถ(-)ดูเหมือนจะมีสองชนิดแตกต่างกันอย่างไร
คำตอบ:
นี่เป็นการตัดสินใจออกแบบในภาษา -1เป็นจำนวน แต่การใช้งานในบริบทนี้จะไม่เกี่ยวข้องกับฟังก์ชั่น (-)(ตามที่ Ackdari กล่าวถึงในคำตอบการใช้งานนี้เกี่ยวข้องกับฟังก์ชั่นnegate) มีการประนีประนอมสองสามอย่างที่ทำให้สิ่งนี้ทำงานได้:
คุณไม่สามารถใช้ชิ้นส่วนที่ถูกต้องของ(-)ผู้ประกอบการ Haskell ได้จัดเตรียมsubtractฟังก์ชัน
คุณไม่สามารถเขียนจำนวนเต็มลบโดยไม่ต้องวงเล็บยกเว้นว่าจะอยู่ที่จุดเริ่มต้นของการมอบหมาย (เช่นโดยตรงหลัง=หรือ->) สิ่งนี้สร้างข้อผิดพลาดในการแยกวิเคราะห์:
let x = 8 * -1
แต่ควรเขียนเป็น
let x = 8 * (-1)
อย่างไรก็ตามนี่เป็นเรื่องปกติ:
let x = -1 * 8สิ่งเหล่านี้ถือว่าเป็นการแลกเปลี่ยนที่สมเหตุสมผลกับนักออกแบบของภาษา
คำตอบนั้นได้รับการยืนยันใน Haskell -wikiแล้ว
unary ลบคือน้ำตาลเชิงซ้อนสำหรับฟังก์ชัน Prelude
negate
เพื่อให้การทำงาน(-)อยู่เสมอa - bฟังก์ชั่นและหากคุณเขียนโค้ดเช่น
คอมไพเลอร์จะแปลเป็นlet x = -ylet x = negate y
ยูนิรีลบเป็นพิเศษใน Haskell ตามที่ระบุไว้ในส่วน 3.4 ของรายงาน :
รูปแบบพิเศษหมายถึงคำนำหน้าปฏิเสธผู้ประกอบการเพียงคำนำหน้าใน Haskell และเป็นไวยากรณ์สำหรับ ตัวดำเนินการไบนารีไม่จำเป็นต้องอ้างถึงคำจำกัดความของในโหมโรง มันอาจจะดีดตัวขึ้นโดยระบบโมดูล อย่างไรก็ตามเอกจะอ้างถึงฟังก์ชั่นที่กำหนดไว้ในโหมโรง ไม่มีการเชื่อมโยงระหว่างความหมายในท้องถิ่นของผู้ประกอบการและการปฏิเสธเป็นอันขาด
-enegate (e)---negate-