Kindness of strangers (or strangeness of Kinds)

wagnerdm at seas.upenn.edu wagnerdm at seas.upenn.edu
Thu Jun 7 04:43:27 CEST 2012


Quoting AntC <anthony_clayden at clear.net.nz>:

> {-# OPTIONS_GHC -XDataKinds -XPolyKinds -XKindSignatures	#-}
>
>     data MyNat = Z | S Nat
>
>     class NatToIntN (n :: MyNat)
>         where natToIntN :: (n :: MyNat) -> Int
>     instance NatToIntN Z
>         where natToIntN _ = 0
>     instance (NatToIntN n) => NatToIntN (S n)
>         where natToIntN _ = 1 + natToInt (undefined :: n)
>
> But GHC rejects the class declaration (method's type):
>     "Kind mis-match
>      Expected kind `ArgKind', but `n' has kind `MyNat'"
> (Taking the Kind signature out of the method's type gives same message.)

At a guess, (->) :: * -> * -> *, but n :: MyNat, not n :: *, so (->) n  
is badly kinded. In comparison:

>     data Proxy a = Proxy
>
>     class NatToInt (n :: MyNat)
>         where natToInt :: Proxy (n :: MyNat) -> Int
>     instance NatToInt Z
>         where natToInt _ = 0
>     instance (NatToInt n) => NatToInt (S n)
>         where natToInt _ = 1 + natToInt (Proxy :: Proxy n)

Here Proxy n :: *, even if n :: MyNat, so Proxy n is a fine argument  
to hand to (->).

~d



More information about the Glasgow-haskell-users mailing list