Чому конструктори даних з однаковою назвою заборонені в конструкторах різного типу?


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є 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) працюють над можливим вирішенням цієї проблеми, включаючи введення нового type classдля всіх типів, що поділяють один і той же конструктор даних, або щось подібне. Тож будьте в курсі, рішення вашої проблеми може бути найближчим часом! (Я сподіваюсь)


Я, безумовно, з нетерпінням чекаю цих type classконструкцій, які ви заявляєте. - Причина в тому , у мене немає проблем, я можу зробити Translate2і Translate3d, але я волів би не забруднювати простір імен.
A Sz

Я не розробник GHC, тому це просто чути-говорити. Я сподіваюся, що це теж станеться.
bstamour
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.