bitterharvest’s diary

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

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

RaspberryPi でHaskellを使う

1.Raspberry Pi Raspberry Piは、一番最初の頃のユーザーなのだが、その後、長いことご無沙汰だった。先日、ベトナムで酪農業の支援をしているコンサルタントの方と話をしているときに、地中、地表、地上のあちこちにセンサーを設けて、様々なデータを収集…

RSA暗号の公開鍵を求める

1.RSA暗号 最近、記事の下に「RSA暗号を生成せよ」という広告がある。この記事の下にもあるのではないかと思うが、そこには次のことが書かれている。RSA暗号を生成せよ。適当な素数\(p\)と\(q\)、下の条件を満たす自然数\(e\) 条件1: \(0 条件2: \(gcd((p-…

素数を求める

1.エラトステネスの篩 素数を求める方法で、よく知られているのはエラストテネスの篩(ふるい)である。原理は次のようになっている。 1.2から始まる自然数のリストを用意する。 2.また、素数が求まっていたとする。 3.素数のリストは、自然数のリス…

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

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

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

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

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

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

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

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

オペレーショナル・モナドで天国と地獄を行ったり来たり(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で分野向けの機械を開発する」で紹介して…

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

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

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)を定義しよう…

Haskellでニューラルネット

1.ニューラルネット ニューラルネットは元来あまり好きではない。人間の脳神経網を表現するモデルとして使われてきたのだが、脳神経網とニューラルネットワークとの間の対比関係を得る手段がないことが嫌いであることの最大の理由である。しかし、昨日、谷口…

Haskellで最大公約数、最小公倍数を求める

1.重要な概念 Haskellの良いところは、簡単にプログラムが書けること。実現するプログラムの意味するところが分かれば、そのまま記述すればよい。JavaやCなどの命令型プログラミング言語ではそうはいかない。意味するところを分析しそれを手順として示さな…

Haskellで分野向けの機械を開発する(3)

1.窮屈からの脱出 数式から木構造を生成する方法が、オペレーショナル・モナドに移行したが、コードが増えた割にはあまりご利益がない。数式の指定が固定的で、キーボードからの自由な入力にはなっていない。そこで、オペレーショナル・モナドの拡張版(モ…

Haskellで分野向けの機械を開発する(2)

1.数式から木構造を作成する機械 「Haskellで数式をビジュアルに」のところでも説明したが、一次元に書かれた数式を二次元の木構造に変換することができる。例は以下のとおりである。 そこで、オペレーショナル・モナドを利用して、数式から木構造を作成す…

Haskellで分野向けの機械を開発する(1)

1.分野向けの機械 Haskellは純粋関数型言語である。自販機、改札機、ロボットなどのある分野に向けた機械に本来備わっている状態を扱うことはあまり得意としていないが、これを可能にしてくれるのが、オペレーショナル・モナドである。オペレーショナル・…

Haskellで数式をビジュアルに(2)

2.プログラムで表現 数式を木構造に変換するプログラムをHaskellで実現する。数式が木構造に変換される様子をもう一度、図で示すと次のようになる。 複雑すぎて、Javaで実現しようとは思わない。直感的にHaskellでも苦労するかなと想像したが、取り越し苦…

Haskellで数式をビジュアルに(1)

1.木構造 数式は見慣れているため、簡単に理解できるように訓練されてはいるが、それでも、少し込み入ってくると、どのように計算したらよいか困るときがある。そのような時、木構造で描くとわかりやすくなる。3*4+5*6を木構造で表すと下図のようになる。 …

解釈次第で!(2)

1.三目並べ オペレーショナル・モナドには、いくつかの例が紹介されてるが、その中から、三目並べ(Tic Tac Tow)を詳しく調べてみる。オペレーショナル・モナドの使用に当たっては、次のモジュールをロードしておく必要がある。 cabal install operational …

解釈次第で!(1)

1.あなたは何を この文章はキーボード上のキーを打ちながら作成している。でも、もし、ワープロのプログラムではなく、ゲームのプログラムが動いていたなら、敵の攻撃をかわすべく、シューティングに夢中になっているかも知らない。このシューティングもキ…

Haskellで遊ぼう = マルチメディア

1.マルチメディアの世界へ Haskellの話は数学やロジックの話が多く、ゲームやアニメーション、はたまた、音楽の世界とは程遠いと思うかもしれないが、そんなことはない。本としては、少し古いのだが、The Haskell School of Expressionがある。これに、コ…

凹むこともある多角形(3)

1.多角形の面積を求める 多角形が凸多角形であるときは、その面積を求めることは簡単である。例えば、多角形の頂点の列が\(v_1, v_2, v_3,..,v_n\)であるとき、\(v_1\)から\(v_3\)へ、さらに\(v_1\)から\(v_4\)へ、同じように\(v_1\)から\(v_{n-1}\)まで、…