bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

2014-09-01から1ヶ月間の記事一覧

オペレーショナル・モナドを解剖する(3)

1.現実の世界へ プログラムとプログラムをつないだらプログラムだという世界を作るために、これまでの論理の世界から、一気に、現実の世界へ移行することとする。プログラムと命令の境目を明確にするために、現実世界での命令を定義する。そのベースになる…

オペレーショナル・モナドを解剖する(2)

1.論理の世界から現実の世界 プルグラムは命令の並びであるが、プログラムとプログラムを接続したものも、またプログラムである。プログラムを命令の集まりとみなしている間は論理の世界で閉じているが、プログラムの並びをプログラムとみなすと、論理の世…

オペレーショナル・モナドを解剖する(1)

1.論理の世界 前回の記事で、米田の補題との関連を述べたが、オペレーショナル・モナドの命令の実行部分については詳しくは触れなかった。今回は、オペレーショナル・モナドの解釈・実行部分、プログラムではiterpretと記述、の部分について説明する。例に…

Haskellプログラミング講座(入門編) - 目次 

1.リスト内包表記を利用して鶴亀算を解く 2.無限数列を再帰的に定義する 3.リスト内包表記を利用して順列・組合せ問題に取り組む 4.パターン照合で並べ替え 5.型があってのHaskell 6.流水算を解く(TypeとTuple) 7.ガードをかためて連立方程式…

米田の補題とオペレーショナル・モナド

1.復習:米田の補題 米田の補題をHaskellで記述する方法については、Haskellの真髄に迫る-一般化代数的データで論じた。米田の補題は次のように定義されていた。 \({\mathcal C}\)を圏とした時、任意の\({\mathcal C}\)の対象\(A\)と関手\(F: {\mathcal C}…

Haskell入門 型があってのHaskell

1.コンパイルできれば完了 Haskellは静的型付けき言語である。このおかげで、信頼性の高いプログラムを作成できる。CやJavaでプログラムを作成するとデバッグに多くの時間がとられる。Haskellだとそのようなことはない。コンパイル出来た瞬間にプログラム…

Haskell入門 パターン照合で並べ替え

1.思い出 昇順に並べ替える問題(ソート)は、カリフォルニア大学のバークレイ校で学んでいるときに、プログラミングの授業の中で出会った。とは言っても、今の時代のように、JavaやCなどの高級言語がない時代で、機械語に近いアセンブリ言語を用いてのプ…

Haskell入門 リスト内包表記を利用して順列・組合せ問題に取り組む

1.好きになれなかった順列と組合せ 順列と組合せは高校生の時に学んだが、数学のほかの分野と異なり、これだけは孤立していて、また、その後の学問的発展も見られそうになかったので、興味のわかない分野であった。後に、確率・統計学も学ぶことになるが、…

Haskell入門 無限数列を再帰的に定義する

1.数列 リストは多様に解釈できる。前の記事の「リスト内包表記を利用して鶴亀算を解く」では、リストを集合と見なした。今回は、リストを数字の並びとみなすこととする。数字の並びは、通常、数列と呼ばれる。高校で、等差数列、等比数列を学んだ事と思う…

Haskell入門 リスト内包表記を利用して鶴亀算を解く

1.頭の体操 ウィキペディアによると、鶴亀算は中国の数学書「孫子算経」の中にある「雉兎同籠」(雉:キジ、兎:ウサギ)が始まりとされている。これが江戸時代になって、目出度い動物である鶴と亀に変わったそうである。小学校の時代に解いた経験を持つ人…

オペレーショナル・モナドで天国と地獄を行ったり来たり(4)

:1.リストの要素をキーボードから入力する「Haskellで分野向けの機械を開発する(3)」で行ったように、オペレーショナル・モナドの拡張版(モナド変換子)を用い、キーボードからリストの要素を入力できるようにする。プログラムListPは命令実行結果aがモ…

オペレーショナル・モナドで天国と地獄を行ったり来たり(3)

1.長さを帰納的に表現した注釈つきリスト 元に戻って、リストの長さを整数ではなく帰納的表現でのリストの生成法を考える。最初に自然数Natを代数的データ型で定義する。 data Nat n = Z | S (Nat n) deriving Show ここで、Zは自然数の始まりを示し、S (N…

オペレーショナル・モナドで天国と地獄を行ったり来たり(2)

1.長さが整数のプログラムを作成 長さ注釈つきリストの構造がはっきりと分かるようにするために、前回の説明とは異なるが、長さを整数で直截に表したリストを用いる。そこで、リストをあるものの並びと並んでいるものの数(長さ)で表すこととし、リストをレ…

オペレーショナル・モナドで天国と地獄を行ったり来たり(1)

1.リスト処理を見やすく 前回の記事で米田の補題を説明するためにリスト処理を用いたが、だいぶ難解であったことと思う。ここでは、リストの構造を見える形にし、オペレーショナル・モナドを用いたときに、リストの処理がどのようになるかをできるだけ分か…

Haskellの真髄に迫る - 一般化代数的データ(8)

1.雑記 米田の補題を用いて、射を集合に、逆に、集合を射に変換できることが分かったが、この原理を利用したのがオペレーショナル・モナドである。このブログにも、オペレーショナル・モナドを用いた例を「Haskellで分野向けの機械を開発する」で紹介して…

XMOS (イベント駆動・並列スレッド)プログラミング(3)

1.簡単なライン・トレース・カーを作成する 1.1 仕様 模造紙の上に黒い線を描き、この線に沿って車が動くようにする。原理は、1)左右に反射型フォトセンサーを用意する。2)両方の反射型フォトセンサーとも白い面を検出している場合には、車はそのまま…

XMOS (イベント駆動・並列スレッド)プログラミング(2)

1.ベンディングマシンを実現する 1.1 仕様 次の状態遷移図(Moore Machine)で表わされるベンディングマシンがあったとする。これを実現することを考える。 このベンディングマシンでは、5円と10円が使えることになっている。投入金額が20円以上になる…

XMOS (イベント駆動・並列スレッド)プログラミング(1)

1.ボタンLEDを光らせる 1.1 プログラムを作る ボタンのLEDを光らせるプログラムは次のようになっていた。 #include<platform.h> out port bled = PORT_BUTTONLED; int main() { bled </platform.h>

Haskellの真髄に迫る - 一般化代数的データ(7)

1.一般的代数的データ型に米田の補題を利用 米田の補題の説明にだいぶ紙幅を割いてしまったが本題に移ることにする。これまで、長さ注釈つきのリストは一般化代数的データを利用して、次のように定義していた。 {-# LANGUAGE GADTs #-} data Z data S n da…

Haskellプログラミング講座(中級編) - 目次

目次 1. ライプニッツの公式から円周率を求める 2. Haskellでクイズ「嫉妬深い男たち」を解く(1)、(2)、(3)、(4)、(5) 3. Haskellを利用して簡単な会計システムを実現する(1)、(2)、(3)、(4)、(5) 4. 乱舞するメッセ…

Haskellの真髄に迫る - 一般化代数的データ(6)

1.米田の補題 圏論の重要な概念のひとつに米田の補題がある。これは次で表される。\({\mathcal C}\)を圏とした時、任意の\({\mathcal C}\)の対象\(A\)と関手\(F: {\mathcal C} \rightarrow {\bf Sets}\)に対して \({\rm Nat}({\rm Hom}(A,-),F) \cong F(A)…

Haskellの真髄に迫る - 一般化代数的データ(5)

1.米田の補題 圏論の重要な概念のひとつに米田の補題がある。これは次で表される。\({\mathcal C}\)を圏とした時、任意の\({\mathcal C}\)の対象\(A\)と関手\(F: {\mathcal C} \rightarrow {\bf Sets}\)に対して \({\rm Nat}({\rm Hom}(A,-),F) \cong F(A)…

Haskellの真髄に迫る - 一般化代数的データ(4)

1.米田の補題 圏論の重要な概念のひとつに米田の補題がある。これは次で表される。\({\mathcal C}\)を圏とした時、任意の\({\mathcal C}\)の対象\(A\)と関手\(F: {\mathcal C} \rightarrow {\bf Sets}\)に対して \({\rm Nat}({\rm Hom}(A,-),F) \cong F(A)…

Haskellの真髄に迫る - 一般化代数的データ(3)

1.リストの長さを整数で ここまで、リストの長さは、ZとS nを用いて表してきたが、リストの長さを分かりやすくするために、整数で表すことにする。そこで、自然数を表す型クラスを準備する。ここでは、これはNatで表すこととする。そして、この型クラスは…

Haskellの真髄に迫る - 一般化代数的データ(2)

1.長さ注釈つきのリスト 前回リストのつくり方を説明したが、ここでは、Gonzalezのブログを参考に、長さを注釈として持つリストを考えることとする。 長さは、二つのデータ型で表すことにする。一つは長さをゼロとするもの、他の一つは、要素を一つ加えたこ…

Haskellの真髄に迫る: 一般化代数的データ(1)

1.代数的データ型の「代数」は何を意味するのか 代数的データ型という言葉はHaskellを始めた人にとってはなじめない言葉だ。代数という言葉の意味は、そのままとれば、数を文字で置き換えるということになる。代数的データ型を用いて整数(Int)を定義しよう…