ทำไมตัวสร้างข้อมูลที่มีชื่อเดียวกันไม่อนุญาตในตัวสร้างประเภทอื่น


11

การประกาศต่อไปนี้ให้ข้อผิดพลาด:

type Vec2d = (Float, Float)
type Vec3d = (Float, Float, Float)
-- Rect x y defines a rectangle spanning from (0,0) to (x,y)
data Obj2d = Rect Float Float
           | Translate Vec2d Obj2d
-- Cuboid x y z defines a cuboid spanning from (0,0,0) to (x,y,z)
data Obj3d = Cuboid Float Float Float
           | Translate Vec3d Obj3d

Multiple declarations of 'Translate'คือ

ตอนนี้ฉันสงสัยว่าทำไมข้อ จำกัด นี้ถูกนำมาใช้?

หากไม่มีข้อ จำกัด ใครก็สามารถเขียนได้

Translate (1, 1) Rect 2 2 และ Translate (1, 2, 3) Cuboid 1 1 1ซึ่งฟังดูเป็นธรรมชาติ

ฉันไม่ (ทันที) ดูว่าสิ่งนี้อาจส่งผลให้เกิดปัญหาในการแยกวิเคราะห์การเสนอราคาเพื่อไม่อนุญาตให้ใช้ชื่อเดียวกันได้หรือไม่ประเภทสามารถสรุปได้โดยอาร์กิวเมนต์ ( Rect 2 2คือ an Obj2d, Cuboid 1 1 1คือObj3d)

ฉันแน่ใจว่ามีเหตุผลที่ดีที่นักออกแบบภาษาเลือกที่จะไม่อนุญาตให้ใช้ชื่อเดียวกันกับตัวสร้างข้อมูลประเภทต่าง ๆ แต่ฉันต้องการที่จะเรียนรู้: ทำไมเมื่อไม่จำเป็นอย่างเห็นได้ชัด?

(และประเภทความเข้าใจผิดเป็นธุรกิจขนมปังและเนยของ Haskell!)


3
เกี่ยวกับประเภทที่ถูกอ้างถึงโดยอาร์กิวเมนต์: คุณรู้ว่าบางครั้งประเภทของอาร์กิวเมนต์อนุมานจากชนิดของฟังก์ชั่น ?

@delnan ฉันไม่ทราบว่า ... ฟังดูเหมือนคำตอบของฉัน ฉันคิดเสมอว่าการอนุมานนั้นอยู่ด้านล่างถึงแม้ว่าฉันจะเห็นความละเอียดคลุมเครือโดยใช้ข้อมูลประเภทจากอีกด้านหนึ่งของกราฟชนิดเมื่อคุณอธิบายว่าเป็นปัจจัยในการตัดสินใจ ... ภาพจิตของฉันสำหรับสิ่งนี้คือประเภทผลตอบแทนที่ด้านล่างของ กราฟและฟังก์ชันเรียกที่ด้านบนความละเอียดคือการรวมที่เกิดขึ้นจากการพับขึ้นจากด้านล่าง แต่นั่นไม่ใช่ภาพรวมทั้งหมดคือสิ่งที่คุณกำลังพูด ไม่น่าแปลกใจในภาษาที่พิมพ์อย่างพึ่งพากันด้วยความสมบูรณ์แบบที่สมบูรณ์แบบนี่น่าจะแม่นยำกว่า ..
จิมมี่ฮอฟฟา

คำตอบ:


13

นั่นเป็นเพราะตัวสร้างข้อมูลเป็นเพียงฟังก์ชั่นและไม่อนุญาตให้ใช้การโอเวอร์โหลดของฟังก์ชันใน Haskell อาจชัดเจนกว่านี้ถ้าคุณใช้ไวยากรณ์ GADT เพื่อกำหนดประเภทของคุณ:

{-# LANGUAGE GADTs #-}
data Obj2d where
    Rect :: Float -> Float -> Obj2d   -- a function from floats to obj2d's
    Translate :: Vec2d -> Obj2d       -- a function from vec2d's to Obj2d's

ฉันเชื่อว่าพวกเขา (GHC devs) กำลังทำงานเพื่อแก้ไขปัญหาที่เป็นไปได้เกี่ยวกับการแนะนำสิ่งใหม่type classสำหรับทุกประเภทที่ใช้ตัวสร้างข้อมูลเดียวกันหรือสิ่งที่คล้ายกัน โปรดคอยติดตามการแก้ไขปัญหาของคุณในเร็ว ๆ นี้! (ฉันหวังว่า)


ฉันรอคอยการtype classก่อสร้างเหล่านี้อย่างแน่นอนที่คุณกำลังกำหนด - เหตุผลคือ: ฉันไม่มีปัญหาฉันสามารถทำได้Translate2และTranslate3dแต่ฉันไม่ควรทำให้เกิดมลทินเนมสเปซ
Sz

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