view slides/20140902/slide.md @ 66:ecb53fc23f6f

Add slide for seminar
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Tue, 02 Sep 2014 17:46:13 +0900
parents
children 309850f23a67
line wrap: on
line source

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
```

* こんな感じなんだろうけれど Monad の return が定義できない
    * (Similar a) の a を固定していないと Monad の instance にできない
    * return :: a1 -> Similar a a1
    * を想定されているが、 id なので Similar a a でおかしい

# Sample : Similar Monad as Functor
```
similar :: (Show b, Eq b) => (a -> b) -> (a -> b) -> a -> b
similar f g x = same $ Similar x g (f x)

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

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

<!-- vim: set filetype=markdown.slide: -->