changeset 4:0805d4984b1f

Update v2.1
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Wed, 29 Oct 2014 15:05:38 +0900
parents 331d9984930f
children 156ae5d5750b
files bachelor_middle_draft.pdf bachelor_middle_draft.tex
diffstat 2 files changed, 63 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
Binary file bachelor_middle_draft.pdf has changed
--- a/bachelor_middle_draft.tex	Wed Oct 29 12:30:55 2014 +0900
+++ b/bachelor_middle_draft.tex	Wed Oct 29 15:05:38 2014 +0900
@@ -42,8 +42,8 @@
 
 \section{限定されたプログラムの変更を表す Delta Monad}
 Monad を用いたプログラムの変更の例として、プログラミング言語HaskellにおけるMonadを利用する。
-Haskell におけるMonadとはメタ計算と対応されたデータ型である。
-Monadであるデータ型は任意の型を内包することができ、内包した型に対する計算を行なった際にメタ計算も同時に行なう。
+Haskell におけるMonadとはメタ計算を内包したデータ型である。
+Monadであるデータ型は任意の型の値を内包することができ、内包した型に対する計算を行なった際にメタ計算も同時に行なう。
 
 Haskell において限定されたプログラムの変更を表すことができる Delta Monad を定義した。
 Delta Monad におけるプログラムの変更は、変更前と変更後の実行結果を両方持つことによって表現する。
@@ -118,9 +118,63 @@
 % {{{ Delta Monad におけるプログラムの変更例
 
 \section{Delta Monad におけるプログラムの変更例}
-Delta Monad を用いたHaskellのプログラムを示す(図\ref{delta-program})。
+変更例となるHaskellのプログラムを示す(図\ref{raw-program-before})。
+
+% {{{ raw-program-before
+
+\begin{breakbox}
+{\scriptsize
+\begin{verbatim}
+generator :: Int -> [Int]
+generator x = [1..x]
+
+primeFilter :: [Int] -> [Int]
+primeFilter xs = filter isPrime xs
+
+count :: [Int] -> Int
+count xs = length xs
+
+primeCount :: Int -> Int
+primeCount x = count . primeFilter . generator $ x
+\end{verbatim}
+}
+\caption{変更前のHaskellプログラム}
+\label{raw-program-before}
+\end{breakbox}
+
+% }}}
+
 
-% {{{ delta.hs
+このプログラムは整数nを取り、1からnまでの整数の中から素数の個数を調べるプログラムである。
+1からnまでの整数の個数を調べる primeCount 関数は3つの関数からなる。
+
+\begin{itemize}
+    \item 1 から n までの整数を返す関数 generator
+    \item 整数のリストから素数である整数のみを残したリストを返す関数 primeFilter
+    \item リストの中に存在する要素の個数を返す関数 count
+\end{itemize}
+
+ここで、 primeFilter 関数を変更する。
+素数である整数を残すのではなく、偶数を残すようにする。
+Delta Monad を使わずに primeFilter 関数を変更すると図\ref{raw-program-after}のプログラムとなる。
+
+% {{{ raw-program-after
+
+\begin{breakbox}
+{\tt
+primeFilter :: [Int] -> [Int]
+
+primeFilter xs = filter \underline{even} xs
+}
+\caption{変更後の primeFilter 関数(変更点は下線)}
+\label{raw-program-after}
+\end{breakbox}
+
+% }}}
+
+プログラム(図\ref{raw-program-before})に対する図\ref{raw-program-after}の変更を Delta Monad で記述したものが図\ref{delta-program}のプログラムである。
+
+% {{{ delta-program
 
 \begin{breakbox}
 {\scriptsize
@@ -142,23 +196,14 @@
 primeCount x = generator x >>= primeFilter >>= count
 \end{verbatim}
 }
-\caption{Delta Monadを用いたプログラムの例}
+\cprotect\caption{図\ref{raw-program-before}のプログラムに対する図\ref{raw-program-after}の変更を Delta Monad で記述した例}
 \label{delta-program}
 \end{breakbox}
 
 % }}}
 
-このプログラムは整数nを取り、1からnまでの整数の中から素数の個数を調べるプログラムである。
-1からnまでの整数の個数を調べるprimeCount 関数は3つの関数からなる
-
-\begin{itemize}
-    \item 1 から n までの整数を返す関数 generator
-    \item 整数のリストから素数であるもののみを残したリストを返す関数 primeFilter
-    \item リストの中に存在する要素の個数を返す関数 count
-\end{itemize}
-
-このプログラムの primeFilter 関数が返す Delta Monad を変更する。
-本来ならば素数である整数のみを返す計算だったが、変更により偶数である整数のみを返すようにした。
+Delta Monad を用いたプログラムでは全ての関数はDelta Monadを返す関数として記述される。
+変更される primeFilter 関数は、素数によるフィルタと偶数によるフィルタの両方の結果を持ったDelta Monad を返すよう変更する。
 図\ref{delta-program}のプログラムを実行した例が図\ref{delta-result}である。
 
 % {{{ results
@@ -178,6 +223,7 @@
 
 % }}}
 
+Delta Monad による実行結果は2つの実行結果が存在する。
 変更前のプログラムの実行順序が上側の実行結果である。
 \begin{itemize}
     \item 1 から 10 までのリストを作成し
@@ -218,6 +264,7 @@
 
 \bibitem{moggi} Eugenio Moggi, Notion of Computation and Monads(1991)
 \bibitem{proofs-and-types} Jean-Yves Girard, Paulr Taylor, Yves Lafont, Proofs and Types(1990)
+\bibitem{category} Michael Barr and Chariles Wells, Category Theory for Computing Science
 \bibitem{agda} The Agda Wiki - Agda \url{http://wiki.portal.chalmers.se/agda/pmwiki.php}
 
 \end{thebibliography}