7

W tej deklaracjiHaskell - określenie rodzaju w deklaracji danych

data Const a = Const Integer 

Haskell wnioskuje, że Const jest * -> *. Czy można zamiast tego zrobić konstruktor typu, więc będzie to (* -> *) -> *? Idealnie powinno być a -> *, ale nie ma rodzajów polimorficznych. This thread pokazuje jedno rozwiązanie - dodanie nieużywanego konstruktora. Czy sytuacja zmieniła się od 2002 roku?

Odpowiedz

13

Masz rację, skoro GHC nie obsługuje typów polimorficznych, będzie to całkiem niewspółmierne do *.

Jednakże, używając rozszerzenia KindSignatures można jednoznacznie opisywanie deklarację danych z określonego rodzaju:

{-# LANGUAGE KindSignatures #-} 

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

Lub, jeśli fanem GADT s:

{-# LANGUAGE GADTs #-} 

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

Można teraz napisz:

x :: Const Maybe 
x = Const 2 

Właśnie skompilowałem oryginalny program z eksperymentalnym Utrecht Haskell Compiler (UHC).

UHC tak naprawdę nie kompiluje programów rzeczywistych, ale wspiera rodzaj polimorfizmu! Interesujące, aby go zobaczyć:

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

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