ดูเหมือนว่า (-) จะมีสองประเภทแตกต่างกันอย่างไร


12

ใน ghci เมื่อฉันพิมพ์

:t (-)

เพื่อหาประเภทของ(-)มันจะกลับมา

(-) :: Num a => a -> a -> a

แต่เมื่อผมเขียน-1Haskell ผลตอบแทนจำนวนซึ่งดูเหมือนว่าจะบ่งบอกว่าเป็นประเภท(-) Num a => a -> aวิธีการสามารถ(-)ดูเหมือนจะมีสองชนิดแตกต่างกันอย่างไร

คำตอบ:


15

นี่เป็นการตัดสินใจออกแบบในภาษา -1เป็นจำนวน แต่การใช้งานในบริบทนี้จะไม่เกี่ยวข้องกับฟังก์ชั่น (-)(ตามที่ Ackdari กล่าวถึงในคำตอบการใช้งานนี้เกี่ยวข้องกับฟังก์ชั่นnegate) มีการประนีประนอมสองสามอย่างที่ทำให้สิ่งนี้ทำงานได้:

  1. คุณไม่สามารถใช้ชิ้นส่วนที่ถูกต้องของ(-)ผู้ประกอบการ Haskell ได้จัดเตรียมsubtractฟังก์ชัน

  2. คุณไม่สามารถเขียนจำนวนเต็มลบโดยไม่ต้องวงเล็บยกเว้นว่าจะอยู่ที่จุดเริ่มต้นของการมอบหมาย (เช่นโดยตรงหลัง=หรือ->) สิ่งนี้สร้างข้อผิดพลาดในการแยกวิเคราะห์:

    let x = 8 * -1

    แต่ควรเขียนเป็น

    let x = 8 * (-1)

    อย่างไรก็ตามนี่เป็นเรื่องปกติ:

    let x = -1 * 8

สิ่งเหล่านี้ถือว่าเป็นการแลกเปลี่ยนที่สมเหตุสมผลกับนักออกแบบของภาษา


8

คำตอบนั้นได้รับการยืนยันใน Haskell -wikiแล้ว

unary ลบคือน้ำตาลเชิงซ้อนสำหรับฟังก์ชัน Prelude negate

เพื่อให้การทำงาน(-)อยู่เสมอa - bฟังก์ชั่นและหากคุณเขียนโค้ดเช่น คอมไพเลอร์จะแปลเป็นlet x = -ylet x = negate y


7

ยูนิรีลบเป็นพิเศษใน Haskell ตามที่ระบุไว้ในส่วน 3.4 ของรายงาน :

รูปแบบพิเศษหมายถึงคำนำหน้าปฏิเสธผู้ประกอบการเพียงคำนำหน้าใน Haskell และเป็นไวยากรณ์สำหรับ ตัวดำเนินการไบนารีไม่จำเป็นต้องอ้างถึงคำจำกัดความของในโหมโรง มันอาจจะดีดตัวขึ้นโดยระบบโมดูล อย่างไรก็ตามเอกจะอ้างถึงฟังก์ชั่นที่กำหนดไว้ในโหมโรง ไม่มีการเชื่อมโยงระหว่างความหมายในท้องถิ่นของผู้ประกอบการและการปฏิเสธเป็นอันขาด-enegate (e)---negate-


2
คำตอบหนึ่งประโยคนั้นไม่ได้รับการสนับสนุนบน SO เช่นเดียวกับลิงก์ที่ไม่มีการสรุปเนื้อหาเนื่องจากอาจทำให้เสียได้
Andrew Ray

ฉันจะสมมติได้ว่าลิงก์ไปยังรายงาน / มาตรฐานนั้นมีการมองในแง่ร้ายน้อยมากเมื่อเทียบกับวิดีโอ wikis / tutorials / youtube
bipll

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