これはもうだめです
{-# LANGUAGE GADTs #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE OverlappingInstances #-} {-# LANGUAGE UndecidableInstances #-} data COP a b data App b class TyEq a b | a -> b where f :: a -> b f v = undefined instance TyEq Int Int instance TyEq (App b) b instance TyEq (COP a b) a instance (TyEqProxy a a') => TyEq a a' s1 :: Int s1 = undefined s2 :: App a s2 = undefined s3 :: COP a b s3 = undefined s4 :: a s4 = undefined class TyEqProxy a b | a -> b instance TyEqProxy a a data Exp t where EInt :: Int -> Exp Int ELam :: (Exp a -> Exp b) -> Exp (a -> b) EApp :: (TyEq t t',t' ~ a) => Exp (a -> b) -> Exp t -> Exp (App b) Cop :: (TyEq c c',c' ~ b) => Exp ((a -> b) -> c) -> Exp (COP a b) e1 :: Exp Int e1 = EInt 1 e2 :: Exp (Int -> Int) e2 = ELam (\(EInt x) -> EInt (x + 1)) e3 :: Exp (App Int) e3 = EApp e2 e1 aux_e4 :: Exp (COP Int b) aux_e4 = Cop (ELam (\k -> EApp k (EInt 2))) e4 :: Exp (App Int) e4 = EApp e2 aux_e4 exit :: Exp (a -> b) exit = ELam exit' where exit' :: Exp a -> Exp b exit' v = error "exit" class CPS cps_a cps_b | cps_a -> cps_b where type Kont1 cps_a cps_b type Kont2 cps_a cps_b cps :: cps_a -> Kont1 cps_a cps_b -> Kont2 cps_a cps_b instance CPS (Exp (App a')) (Exp b') where type Kont1 (Exp (App a')) (Exp b') = Exp (a' -> b') type Kont2 (Exp (App a')) (Exp b') = Exp b' cps (EApp (f :: Exp (arg -> b {- bはSTV上仕方がない。b = a'-} )) (arg :: Exp c) :: Exp (App a')) (ELam k :: Kont1 (Exp (App a')) (Exp b')) = v where k' :: Exp a' -> Exp b' k' = k k1_body :: (CPS (Exp c) d,Kont1 (Exp c) d ~ Exp (arg -> b')) => Exp (arg -> b) -> Kont2 (Exp c) d -- Exp b' k1_body = (\(f' :: Exp (arg -> b)) -> case f' of ELam f'' -> k2_body f''' where f''' :: Exp arg -> Exp a' f''' = f'' ) k2_body :: (CPS (Exp c) d,Kont1 (Exp c) d ~ Exp (arg -> b')) => (Exp arg -> Exp a') -> Kont2 (Exp c) d k2_body (f'' :: Exp arg -> Exp a') = cps (arg :: Exp c) (ELam (\(arg' :: Exp arg) -> ((k' ((f'' arg') :: Exp a')) :: Exp b' ) ) :: Exp (arg -> b')) k1 :: (CPS (Exp c) d,Kont1 (Exp c) d ~ Exp (arg -> b'),Kont2 (Exp c) d ~ Exp z) => Exp ((arg -> a') -> z) k1 = ELam k1_body v :: (CPS (Exp (arg -> a')) cps_b,CPS (Exp c) d,Kont1 (Exp c) d ~ Exp (arg -> b'),Kont2 (Exp c) d ~ Exp z,Kont1 (Exp (arg -> a')) cps_b ~ Exp ((arg -> a') -> z)) => Kont2 (Exp (arg -> a')) cps_b v = cps f k1
はてなに張ると、突き破って横に伸びちゃうのをなんとかしたいです。
スーパーpre記法使う時に、スクロールバーさんが出てくれれば良いのかな?
む、しかしGoogle Chorme使ってると自動で改行されてる。
Firefoxだと突き破る。(スクロールするようにした)