Kiedy eksperymentowałem z rodzajami Haskella i starałem się uzyskać tego rodzaju ->
, a to pokazało:
$ ghci
...
Prelude> :k (->)
(->) :: ?? -> ? -> *
Prelude>
Zamiast oczekiwanego * -> * -> *
. Jakie są ??
i ?
rzeczy? Czy mają na myśli konkretne typy czy „miłe zmienne”? Albo coś innego?
Odpowiedzi:
96 dla odpowiedzi nr 1Są to specyficzne dla GHC rozszerzenia systemu rodzaju Haskell. Raport Haskell 98 określa tylko prosty rodzaj systemu:
... wyrażenia typu są klasyfikowane na różne rodzaje, które biorą jeden dwóch możliwych form:
Symbol * reprezentuje rodzaj wszystkie konstruktory typu zerowego. Jeśli k1 i k2 są rodzajami, wtedy k1-> k2 jest rodzaj rodzajów, które mają rodzaj k1 i zwraca rodzaj rodzaju k2.
GHC rozszerza ten system z pewnego rodzaju podtypami, aby pozwolić typy rozpakowane, i aby pozwolić konstruktorowi funkcji na polimorficzny w stosunku do rodzajów. Rodzaj sieci obsługiwanej przez GHC to:
?
/
/
?? (#)
/
* #
Where: * [LiftedTypeKind] means boxed type
# [UnliftedTypeKind] means unboxed type
(#) [UbxTupleKind] means unboxed tuple
?? [ArgTypeKind] is the lub of {*, #}
? [OpenTypeKind] means any type at all
Zdefiniowany w ghc / compiler / types / Type.lhs
W szczególności:
> error :: forall a:?. String -> a
> (->) :: ?? -> ? -> *
> (\(x::t) -> ...)
Gdzie w ostatnim przykładzie t :: ??
(tj. nie jest krotką bez opakowania). Tak więc, cytując GHC, „na poziomie rodzaju istnieje niewielkie poddziałanie”.
W przypadku zainteresowanych dusz GHC obsługuje również typy i rodzaje przymusu („warunki na poziomie rodzaju, które działają jako dowód na równość typów”, zgodnie z potrzebami System Fc) stosowane w GADT, nowych typach i rodzinach typów.