PolyKind issue in GHC 7.6.1rc1: How to make a kind a functional dependency?
Andrea Vezzosi
sanzhiyan at gmail.com
Tue Sep 4 04:28:43 CEST 2012
On Mon, Sep 3, 2012 at 9:26 PM, Richard Eisenberg <eir at cis.upenn.edu> wrote:
> [...]
> So, it seems possible to introduce eta coercions into FC for all kinds containing only one type constructor without sacrificing soundness. How the type inference engine/source Haskell triggers the use of these coercions is another matter, but there doesn't seem to be anything fundamentally wrong with the idea.
>
A recent snapshot of ghc HEAD doesn't seem to agree:
{-# LANGUAGE GADTs, KindSignatures, PolyKinds, DataKinds,
TypeFamilies, ScopedTypeVariables, TypeOperators #-}
import GHC.Exts
import Unsafe.Coerce
data (:=:) :: k -> k -> * where
Refl :: a :=: a
trans :: a :=: b -> b :=: c -> a :=: c
trans Refl Refl = Refl
type family Fst (x :: (a,b)) :: a
type family Snd (x :: (a,b)) :: b
type instance Fst '(a,b) = a
type instance Snd '(a,b) = b
eta :: x :=: '(Fst x, Snd x)
eta = unsafeCoerce Refl
-- ^^^ this is an acceptable way to simulate new coercions, i hope
type family Bad s t (x :: (a,b)) :: *
type instance Bad s t '(a,b) = s
type instance Bad s t Any = t
refl_Any :: Any :=: Any
refl_Any = Refl
cong_Bad :: x :=: y -> Bad s t x :=: Bad s t y
cong_Bad Refl = Refl
s_eq_t :: forall (s :: *) (t :: *). s :=: t
s_eq_t = cong_Bad (trans refl_Any eta)
subst :: x :=: y -> x -> y
subst Refl x = x
coerce :: s -> t
coerce = subst s_eq_t
{-
GHCi, version 7.7.20120830: http://www.haskell.org/ghc/ :? for help
*Main> coerce (4.0 :: Double) :: (Int,Int)
(Segmentation fault
-}
-- Andrea Vezzosi
More information about the Glasgow-haskell-users
mailing list