title: プログラムのデバッグ支援(仮) author: Yasutaka Higa cover: lang: Japanese # 研究目的(仮) * プログラミングにおいて、ソースコードを改変するとプログラムの挙動も変わる * しかしリファクタリングにおいてはソースコードを変更した後も同じ結果を得たい * ソースコードの改変をモナドとして記述し、実行結果の変化を自動的に検出したい * これによりリファクタリング支援や後方互換性の支援などを行なう # 業務連絡 + 近況報告 * 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 の型がー * とりあえず悩み中です