Perché i costruttori di dati con lo stesso nome non sono consentiti in diversi costruttori di tipi?

10

La seguente dichiarazione dà un errore:

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

ovvero Multiple declarations of 'Translate' .

Ora, mi chiedo perché questa limitazione è stata introdotta?

Se la limitazione non fosse presente, si potrebbe scrivere

Translate (1, 1) Rect 2 2 e Translate (1, 2, 3) Cuboid 1 1 1 , che sembra naturale.

Non vedo (immediatamente) come questo potrebbe portare a un problema di analisi che non consente di utilizzare lo stesso nome, il tipo potrebbe essere desunto dall'argomento ( Rect 2 2 è un Obj2d , Cuboid 1 1 1 è un Obj3d ).

Sono certo che ci sia un buon motivo per cui i progettisti linguistici hanno scelto di non utilizzare lo stesso nome per costruttori di dati di tipi diversi, ma mi piacerebbe imparare: perché, quando non è ovviamente necessario?

(E digita disambiguazione è il business del pane e burro di Haskell!)

    
posta A Sz 23.06.2014 - 17:59
fonte

1 risposta

12

Questo perché i costruttori di dati sono solo funzioni e l'overloading delle funzioni non è consentito in Haskell. Potrebbe essere più chiaro se usi la sintassi GADT per definire i tuoi tipi:

{-# 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

Credo che (gli sviluppatori di GHC) stiano lavorando a possibili soluzioni a questo problema che comportano l'introduzione di un nuovo type class per tutti i tipi che condividono lo stesso costruttore di dati o qualcosa di simile. Quindi rimanete sintonizzati, una soluzione al vostro problema potrebbe arrivare presto! (Spero)

    
risposta data 23.06.2014 - 19:19
fonte

Leggi altre domande sui tag