Mercurial > hg > Papers > 2015 > atton-thesis
annotate delta.tex @ 11:76ce5bb18092
Add Category definition
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 08 Feb 2015 11:53:19 +0900 |
parents | c2dda6eeab57 |
children | 11015b94a5cd |
rev | line source |
---|---|
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 \chapter{プログラムの変更を表現する Delta Monad} |
11
76ce5bb18092
Add Category definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
2 \label{chapter:delta} |
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 本研究では Monad によりプログラムの変更を定義する。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 そのためにまずはプログラムを定義する。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 プログラムは型付けされた値と、値を値へと写像する関数のみで構成されるものとする。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 プログラムの実行は関数の値への適用とする。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 入出力といった、値や関数で表現できない計算はメタ計算とする。 |
10 | 10 メタ計算をある性質を持つデータ構造に対応させ、メタ計算が必要な関数は値をデータ構造へと写像することで入出力といった処理を実現する。 |
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 メタ計算とデータ構造の対応に用いる性質が Monad である。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 プログラムの変更とは関数や値が変更されることであり、変更される量には単位があるとする。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 最初の変更単位をバージョン1とし、変更された後のプログラムはバージョンが1増加する。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 ここで、プログラムが変更される際に過去のバージョンのプログラムも保存するメタ計算を提案する。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 全ての変更単位で変更されたプログラムを保存し、それらを比較することでプログラムの変更を表現しようと考えた。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 このメタ計算を表す Monad を Delta Monad と呼ぶ。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 \section{Delta Monad の定義} |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 |
11
76ce5bb18092
Add Category definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
22 任意の型Aに対するメタ計算Tを考えた時、プログラムの変更は式\ref{exp:meta_computation_definition}のように定義される。 |
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 \begin{equation} |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 T A = V A |
11
76ce5bb18092
Add Category definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
26 \label{exp:meta_computation_definition} |
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 \end{equation} |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 V はプログラムの全てバージョンの集合であり、V AとすることでAに対応する値の集合を返すものとする。 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 |
8
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
31 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
32 |
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 \section{Haskell における Delta Monad の実装例} |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 |
9
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
35 式\ref{meta_computation_definition}のメタ計算をMonadで実現する。 |
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 実装例としてプログラミング言語 Haskell を用いる。 |
8
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
38 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
39 まずは全てのプログラムのバージョンを表わすデータ型 Delta を考える。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
40 Delta の定義は \ref{src:delta_constructor} とする。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
41 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
42 \begin{table}[html] |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
43 \lstinputlisting[label=src:delta_constructor, caption=Haskellにおけるデータ型Deltaの定義]{src/delta_constructor.hs} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
44 \end{table} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
45 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
46 データ型 Delta はコンストラクタ Delta もしくは Mono によって構成される。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
47 バージョンが1である値は Mono によって構成される。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
48 プログラムを変更する際には、コンストラクタ Delta を用いて記述し、変更後の値と前のバージョンを持つ。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
49 なお、a とは任意の型であり、Delta が任意の型の値に対してもデータ型を構築できることを示す。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
50 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
51 データ型 Delta に対応するメタ計算は\ref{src:delta_instance_monad}と定義する。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
52 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
53 \begin{table}[html] |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
54 \lstinputlisting[label=src:delta_instance_monad, caption=Haskell におけるデータ型Deltaとメタ計算の関連付け] |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
55 {src/delta_instance_monad.hs} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
56 \end{table} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
57 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
58 Haskell においてメタ計算とデータ型の対応は Monad によって行なうため、 Monad という型クラスが用意されている。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
59 型クラスとは特定の性質を持つ型をまとめるための制約である。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
60 ある型が型クラスに属するためには制約として型クラスによって指定された関数を定義する必要がある。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
61 型クラス Monad に要請される関数は return と \verb/>>=/ であり、型クラスは\ref{src:monad_class}のように定義されている。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
62 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
63 \begin{table}[html] |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
64 \lstinputlisting[label=src:monad_class, caption=Haskell における Monad 型クラス] |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
65 {src/monad_class.hs} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
66 \end{table} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
67 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
68 関数 return は任意の型aを受けとり、メタ計算と対応された型に対応させて返す。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
69 \verb/>>=/ は中置関数であり、left operand と right operand を取る。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
70 left operand であるメタ計算と対応された値と、right operand であるメタ計算と対応された値を返す関数を取り、メタ計算を行ないながら関数を適用する。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
71 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
72 型クラスMonad を Delta に適用した結果は以下のようになる。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
73 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
74 \begin{itemize} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
75 \item 関数 return |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
76 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
77 通常の値をメタ計算と対応させるため、値をバージョン1の値とする。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
78 そのためにコンストラクタ Mono を用いる。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
79 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
80 \item 中置関数 \verb/>>=/ |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
81 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
82 メタ計算を含んだ関数の適用であるため、値と関数の同じバージョンを計算して返すものとなる。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
83 もしバージョン1であった場合はコンストラクタは Mono であるため、Mono が持っている値に対して関数を適用することとなる。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
84 もしバージョンが1で無い場合のコンストラクタは Delta であるため、先頭の値を用いて計算し、残りの値と結合することとなる。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
85 その際、先頭の値を取り出すために headDelta 関数を、先頭以外の値を取り出すために tailDelta 関数を用いる。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
86 \end{itemize} |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
87 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
88 なお、中置関数 \verb/>>=/ で用いたコンストラクタによる処理の分岐はパターンマッチと呼ばれる。 |
c4da3e667aad
Add Delta definition in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
89 Haskell ではコンストラクタごとに関数を記述することでパターンマッチを実現する。 |
6
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 |
3b861ecdec9b
Add description meta computation
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 |
9
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
92 \section{Delta を用いたプログラムの変更の記述例} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
93 プログラムの変更を表現するメタ計算に対応するデータ型 Delta が記述できた。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
94 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
95 実際に Haskell で Delta を用いたプログラムの変更例を\ref{src:delta_example}に示す。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
96 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
97 \begin{table}[html] |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
98 \lstinputlisting[label=src:delta_example, caption=Deltaを用いたプログラムの例] |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
99 {src/delta_example.hs} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
100 \end{table} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
101 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
102 \ref{src:delta_example}は1からnの間の整数に含まれる特定の数の個数を調べるプログラム numberCount である。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
103 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
104 このプログラムは3つの関数からなり、2つのバージョンを含む。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
105 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
106 \begin{itemize} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
107 \item generator |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
108 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
109 1からnの間の整数を生成する関数である。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
110 nを渡すことにより1からnの間の整数のリストを返す。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
111 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
112 \item numberFilter |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
113 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
114 数のリストから特定の数のみを絞り込む関数である。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
115 バージョン1では素数の数のみを絞り込み、バージョン2では偶数の数のみを絞り込んでいる。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
116 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
117 \item count |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
118 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
119 数の個数を数える関数である。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
120 整数はリストで与えられるため、リストの長さが個数であるとした。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
121 \end{itemize} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
122 |
10 | 123 これらの関数3つをMonad の \verb/>>=/ によってメタ計算を含む関数呼び出しとして実行する。 |
124 3つの関数を実行する関数が numberCount 関数であり、この関数がプログラム本体である。 | |
125 numberCount を実行すると \ref{txt:delta_example_result}のような結果が得られる。 | |
9
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
126 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
127 \begin{table}[html] |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
128 \lstinputlisting[label=txt:delta_example_result, caption=numberCountプログラムの実行結果] {src/delta_example_result.txt} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
129 \end{table} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
130 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
131 これはnに1000を与えた結果である。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
132 バージョン1の時は素数の数を求めるため計算結果は168であり、バージョン2の時は偶数の数を求めるために計算結果は500となる。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
133 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
134 3つの関数で構成されたプログラムに対して1つの変更を加えたプログラムを表現することができた。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
135 つまり、Monad によってプログラムの変更をメタ計算として定義できたと言える。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
136 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
137 Haskell において実装した Delta Monad はプログラムの変更を含めた計算もメタ計算としてHaskellで実行する。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
138 これはプログラムの変更からどのような処理を導くかをメタ計算として Haskell で実行可能であることを意味する。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
139 つまり、図\ref{fig:non_delta_example}のようにプログラムにおいてバージョンが変わるごとにバージョン間の関係が存在しない状態から、図\ref{fig:delta_example}のようにプログラムの変更を含めてプログラムを実行可能となったことを意味する。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
140 例えば、プログラムの実行時にバージョン間の挙動の比較することで過去の挙動との差異を指摘することなどが可能となる。 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
141 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
142 \begin{figure}[htbp] |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
143 \begin{center} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
144 \includegraphics[scale=0.8]{fig/non_delta_example.pdf} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
145 \caption{Deltaを用いない通常のプログラムの例} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
146 \label{fig:non_delta_example} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
147 \end{center} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
148 \end{figure} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
149 |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
150 \begin{figure}[htbp] |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
151 \begin{center} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
152 \includegraphics[scale=0.8]{fig/delta_example.pdf} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
153 \caption{Deltaを用いたプログラムの例} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
154 \label{fig:delta_example} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
155 \end{center} |
324111203070
Add example used delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
156 \end{figure} |