# HG changeset patch # User Yasutaka Higa # Date 1414562738 -32400 # Node ID 0805d4984b1f37c0e3af970e42914ce8d3758b6d # Parent 331d9984930f728921a54402231929408daf74b6 Update v2.1 diff -r 331d9984930f -r 0805d4984b1f bachelor_middle_draft.pdf Binary file bachelor_middle_draft.pdf has changed diff -r 331d9984930f -r 0805d4984b1f bachelor_middle_draft.tex --- 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}