7

In dieser ErklärungHaskell - Angabe Art in Datendeklaration

data Const a = Const Integer 

Haskell folgert, dass Const* -> * ist. Ist es möglich zu machen Const stattdessen einen Typkonstruktor nehmen, so wird es (* -> *) -> * sein? Idealerweise sollte es a -> * sein, aber es gibt keine polymorphen Arten. This thread zeigt eine Lösung - unbenutzten Konstruktor hinzufügen. Hat sich die Situation seit 2002 verändert?

Antwort

13

Sie haben recht, da GHC keine polymorphen Arten unterstützt, wird es standardmäßig *.

jedoch die KindSignatures Erweiterung verwenden, können Sie explizit eine Datendeklaration mit einer bestimmten Art mit Anmerkungen versehen:

{-# LANGUAGE KindSignatures #-} 

data Const (a :: * -> *) = Const Integer 

Oder, wenn Ihr ein Fan von GADT s:

{-# LANGUAGE GADTs #-} 

data Const :: (* -> *) -> * where 
    Const :: Integer -> Const a 

Sie können jetzt schreiben:

x :: Const Maybe 
x = Const 2 

ich nur das ursprüngliche Programm mit der experimentellen Utrecht Haskell Compiler (UHC) zusammengestellt.

Der UHC kompiliert nicht wirklich reale Programme, aber er unterstützt guten Polymorphismus! Sein Interesse daran, es zu sehen:

-- kind of data type: 
Const :: forall a . a -> * 

-- type of constructor: 
Const :: Integer -> forall* a . forall b(a) . Const b