プログラムのデバッグ支援

Yasutaka Higa - profile not found -

研究目的

近況報告

Similar

data Similar a = Single a | Similar a (Similar a)

Similar Syntax

Similar Syntax Example

double :: Int -> Similar Int
double x = Single (2 * x)

twicePlus :: Int -> Similar Int
twicePlus x = Similar (x + x) (double x)

Similar as Functor

instance Functor Similar where
   fmap f (Single a)    = Single (f a)
   fmap f (Similar a s) = Similar (f a) (fmap f s)

Similar as Monad

Similar (Single (Similar 1 (Single 1)))
        (Single (Single (Similar 1 (Single 1))))

Definition : mu

mu :: (Similar (Similar a)) -> Similar a
mu (Single s)     = s
mu (Similar s ss) = similar s (mu ss)

Definition : Similar as Monad

instance Monad Similar where
    return              = Single
    (Single x)    >>= f = f x
    (Similar x s) >>= f = mu $ Similar (f x) (fmap f s)

Get value : Similar

same :: (Eq a) => Similar a -> a
same (Single x)    = x
same (Similar x s) = if x == (same s) then x else (error "same")

Get value : Similar

value :: Similar a -> a
value (Single x)    = x
value (Similar x s) = value s

Execution Samples : bind

*Main>  return 100 >>= double  >>= twicePlus
Similar 400 (Single 400)
*Main>  return 100 >>= double  >>= twicePlus >>= plusTwo
Similar 402 (Similar 800 (Similar 402 (Single 800)))

Execution Samples : Get value

*Main> same $  return 100 >>= double  >>= twicePlus >>= plusTwo
*** Exception: same
*Main> same $  return 100 >>= double  >>= twicePlus
400

Similar as Applicative Functor

Define : Similar as Applicative Functor

instance Applicative Similar where
    pure                 = Single
    (Single f)    <*> s  = fmap f s
    (Similar f s) <*> ss = similar (fmap f ss) (s <*> ss)

summary