プログラムのデバッグ支援(仮)

Yasutaka Higa

プログラムのデバッグ支援(仮)

研究目的(仮)

  • プログラミングにおいて、ソースコードを改変するとプログラムの挙動も変わる
  • しかしリファクタリングにおいてはソースコードを変更した後も同じ結果を得たい
  • ソースコードの改変をモナドとして記述し、実行結果の変化を自動的に検出したい
  • これによりリファクタリング支援や後方互換性の支援などを行なう

業務連絡 + 近況報告

  • PS4 環境開発詳細? (from 長田先生)
  • Similar Monad
    • as Functor
    • as Monad (has Constraint)

Similar Monad

  • 似てるっぽい関数を記述して実行すると違う時に怒って欲しい
  • 値比較ができるのなら良いのですが
  • /Users/one/hg/Members/atton/similar_monad
data Similar a b = Similar a (a -> b) b
data Similar a a = Similar a (a -> a) a
  • 型変数をどう扱うかで悩み中です

Usage : Similar Monad

initObj = Similar 100 id 100

initObj >>= \x -> Similar x f (g x) >>= ...

f と g の diff があったら »= の時点で怒って欲しい

Similar Monad as Functor

data Similar a b = Similar a (a -> b) b
instance Functor (Similar a) where
  fmap g (Similar a f b) = Similar a (g . f) $ g b
  • 型変数が2つだと Functor の定義は楽

Similar Monad as Functor

instance Monad (Similar a) where
    return x = Similar x id x -- NG
    s >>= f  = mu (eqmap f s)
  • 型変数が2つだと Monad の return が定義できない
    • (Similar a) の a を固定していないと Monad の instance にできない
    • return :: a1 -> Similar a a1
    • を想定されているが、 id なので Similar a a でおかしい

Sample : Similar Monad as Functor (revision 9)

similar :: (Show b, Eq b) => (a -> b) -> (a -> b) -> a -> b
similar f g x = same $ Similar x g (f x)

-- samples
ok         = map (similar twicePlus double)  [1..10]
notOk      = map (similar twicePlus plusTwo) [1..10]
okSpecific = map (similar twicePlus plusTwo) [2]

Similar Monad as Monad

data Similar a b = Similar a (a -> b) b

instance EqMonad Similar where
  return x = Similar x id x
  s >>= f  = mu (eqmap f s)
  • 型変数が1つなら Monad の定義はできる
  • 通常の Functor だと (a -> b) の b に constraint をかけられない

Similar Monad as Monad

class EqFunctor f where
  eqmap :: (Eq a, Eq b) => (a -> b) -> f a -> f b

instance EqFunctor Similar where
  eqmap f s = Similar fs id fs
    where fs = f $ same s
  • (a -> b) の b が Eq 保証された Functor Class を使えばどうにか

Sample : Similar Monad as Monad (revision 11)

same $ return 100 >>= (\x -> Similar x twicePlus $ double x)
200

same $ return 2 >>= (\x -> Similar x plusTwo $ double x)
4

same $ return 100 >>= (\x -> Similar x plusTwo $ double x)
*** Exception: Prelude.undefined

Problem

  • type variable が 1つだと
    • Functor で移す先が Eq である保証が無くて怒られる
  • type variable が 2つだと
    • return の型がー
  • とりあえず悩み中です