例：

spec Q a = N | M a (Q a) 
   emptyQ :: Q a 
   emptyQ = N 
   isEmpty N = True 
   enQ :: a -> Q a -> Q a  --
impl Qi a = Qi [a] [a]  -- 同じ型変数
   emptyQ :: Qi a     -- 型宣言が必要
   emptyQ = Qi [] []
   enQ :: a -> Qi a -> Qi a -- 上のenQと同じ型変数 
abstractedBy 
   view = RINVCODE

-- 元のコード
f N = ...            --
... emptyQ ...       -- 
... isEmpty ...      -- 

-- Qiを使うことは禁止 -- 

===変換===>
{-# OPTIONS -XTemplateHaskell -XTypeOperators -fglasgow-exts #-}

{-# LINE ... #-}
data Q a = N | M a (Q a) 

instance UpdatableView (Qi a) (Q a) where
  view = RINVCODE

{-# LINE ... #-} -- 適切なLINEの挿入
isEmpty N = True -- 元の関数はそのまま
emptyQ :: Q a 
emptyQ = 
  let {-# LINE ... #- }
      emptyQ :: Qi a 
      emptyQ = ...
  in $(toView :: Qi a -> Q a)  emptyQ -- 適切な変換関数の挿入

enQ :: a -> Q a -> Q a 
enQ =
  let {-# LINE ... #-}
      enQ :: Qi a  
      enQ ...
  in $(toView :: (a -> Qi a -> Qi a) -> (a -> Q a -> Q a)) enQ


{-# LINE ... #-} 
-- 元のコード
f N = ...            --
... emptyQ ...       -- 
... isEmpty ...      -- 

