you tutorialspoint tutorial program learnyouahaskell learn great good for haskell types type-systems

tutorialspoint - learn you a haskell pdf



Haskell Weird Kinds: Tipo de(->) es ??->?->* (1)

Cuando estaba experimentando con tipos de Haskell, y tratando de obtener el tipo de -> , y esto apareció:

$ ghci ... Prelude> :k (->) (->) :: ?? -> ? -> * Prelude>

En lugar de lo esperado * -> * -> * . ¿Cuáles son los ?? y ? ¿cosas? ¿Significan tipos concretos o "variables amables"? ¿O algo mas?


Estas son extensiones específicas de GHC del sistema tipo Haskell. El informe Haskell 98 especifica solo un sistema tipo simple :

... las expresiones de tipo se clasifican en diferentes tipos, que toman una de dos formas posibles:

El símbolo * representa el tipo de todos los constructores de tipo nullary. Si k1 y k2 son tipos, entonces k1-> k2 es el tipo de tipos que toman un tipo de tipo k1 y devuelven un tipo de tipo k2.

GHC amplía este sistema con una forma de subtipado tipo , para permitir tipos no compartidos , y para permitir que el constructor de funciones sea polimórfico sobre clases. El tipo de celosía que GHC admite es:

? // / / ?? (#) / / * # Where: * [LiftedTypeKind] means boxed type # [UnliftedTypeKind] means unboxed type (#) [UbxTupleKind] means unboxed tuple ?? [ArgTypeKind] is the lub of {*, #} ? [OpenTypeKind] means any type at all

Definido en ghc/compiler/types/Type.lhs

En particular:

> error :: forall a:?. String -> a > (->) :: ?? -> ? -> * > (//(x::t) -> ...)

¿Dónde en el último ejemplo t :: ?? (es decir, no es una tupla sin caja). Entonces, para citar a GHC, "hay un pequeño subtipo en el nivel amable".

Para las almas interesadas, GHC también admite clases y tipos de coerción ("términos de nivel de tipo que actúan como evidencia de igualdades de tipo", según lo necesite el sistema Fc ) utilizados en GADT, newtypes y familias de tipos.