読者です 読者をやめる 読者になる 読者になる

bitterharvest’s diary

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

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}\)まで、…

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

1.凸多角形 多角形には凸多角形と凹多角形とがある。多角形の面積を求めるときは、三角形に分解してぞれぞれの面積を求め、最後に、それらの総和を求め、これを多角形の面積とする。しかし、凹多角形の場合には、間違ったアルゴリズムを利用すると、多角形…

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

1.タイプを用意 多角形は、コンピュータ・グラフィックスやアニメーションを行うときに最も基本的な図形である。多角形には、三角形も、四角形も含まれるし、辺の数をとても多くしてあげると、円にも楕円にもなる。そこで、多角形を記述するのに必要な型シ…

数を整然と並べる

数がきれいに並んでいるものに、等差数列と等比数列がある。Haskellで記述する。 1.等差数列 等差数列は、各項の差が同じものをいう。例えば、奇数を小さい方から大きい方に並べると1.3.5.7…となるが、これは、最初の値(初期値)が1、差が2の等差数列で…

Haskellでウェブ・アプリケーション(4)

1.ブログを作成する 次の課題は「簡単なブログ」である。これは次の図に示すように三種類の機能を有している。一つはこれまでの記事の一覧表示であり、二つ目は新しい記事の入力であり、三番目は選択された記事の内容の表示である。 この課題は二つの相互…

Haskellでウェブ・アプリケーション(3)

1.回文を作る 最初の例は入力したテキストをそのまま出力していたが、今回は、加工する。そこで課題は「入力されたテキストと、それを逆順にしたテキストを接続して表示する」とする。このサービスをMirrorということにする。前回と同じように、まず、コン…

Haskellでウェブ・アプリケーション(2)

1.ブログの構築 ウェブで紹介されているHaskell web programmingは、簡潔で分かりやすい例題である。その内容に沿って説明し、yesogの活用法を学ぶこととする。 2.エコーで返す 最初の課題は、「/echo/テキストにアクセスしたら、そのテキストを返す」と…

Haskellでウェブ・アプリケーション(1)

1.ウェブ・アプリケーション・システムの構造 ウェブ・アプリケーションには毎日のごとくお世話になっている。このブログもウェブ・アプリケーションに一つであるし、困った時の検索エンジンや乗換案内などもウェブ・アプリケーションである。ウェブ・アプ…

細かく細かく分解する(2)

1.3次多項式の因数分解 2次の多項式の因数分解ができるようになったので、3次の多項式について考える。一般に、3次の多項式は\(p \times x^3 +q \times x^2 +r \times x + s\)と表すことができる。但し、\(p>0\)。これは因数分解できる場合には、\(a \…

細かく細かく分解する(1)

1.素因数分解 自然数を素数の積として表すのが素因数分解である。例えば、35という数は、素数5と7の積としてあらわすことができる。それでは自然数が与えられた時、それを素因数分解するプログラムを考えよう。与えらえた自然数を\(n\)とする。素数は次の…

Haskellでお絵かき(4)

1.フラクタル 数学的な模様で有名なのはフラクタルである。同じ操作を繰り返すことで、幾何学的に作成したとは思えないほどの面白い模様を作り出してくれる。マンデルブロのフラクタル幾何学を見ると、楽しい図形が沢山出ている。今回は、その中のいくつか…

Haskellでお絵かき(3)

1.自然数を数学的な模様にする 中学生のとき、素因数分解を学んだ。与えられた自然数を、割り切れない数(素数)の積で表したものだ。例えば、102は素数17,3,2の積で表すことができる。 自然数をその構成要素である素数を用いて絵画的に表すことを考えたのは…

Haskellでお絵かき(2)

1.円模様(アポロニウスのネット) Diagramsのギャラリーを見ていると、一つの円の中に外接しあう大小の円が模様のように描かれているものがある。それはアポロニウスのネットと呼ばれている。これは、デカルトの円定理を用いて作られたものである。 デカル…

Haskellでお絵かき(1)

1.お絵かき 論文を執筆する時、説明のために必ずいくつかの図を描く。特に、概念が難しい時は、図の役割はとても大きい。この頃は、Power Pointで図を描くことが多くなってきた。これは、Power Pointを用いると、割に簡単に描けることに起因している。しか…

乱舞するメッセージ(4)

1.会計システムを完成させる 様々な準備が整ったので、会計システムをいよいよ完成させることにする。これまでのシステムの欠点は、複雑なメッセージの送受ができないことと、担当者ごとにメッセージを送るための通信路を設けていることである。会社の規模…

乱舞するメッセージ(3)

1.帳簿をつける 担当者間でメッセージを送ることが可能になったので、帳簿をつけることにする。Haskellでのプログラムが、他の言語でのプログラムと異なる点は、変数の値を変えられないということである(STMは例外で、値の変更を安全におこなえる仕組みを…

乱舞するメッセージ(2)

1.小さな会社 小さな会社の従業員は、購買担当者、営業担当者、経理担当者の3人とし、小さな会社は現金取引で商いをしているとする。購買担当者は仕入れをしたとき、経理担当者にその個数を伝えるものとし、販売担当者は販売をしたとき、経理担当者にやは…

乱舞するメッセージ(1)

1.概略 複数のエージェントがトランザクション処理を行う場合は並行処理となる。並行処理においては、複数のエージェントが一つの資源を争う場合がある。会計システムであれば帳簿であるし、航空券のチケット予約システムでは座席ということになる。 並行…

Haskellを利用して簡単な会計システムを実現する(5)

1.小さな会社を運用してみる 小さな会社での登場人物が独立したエージェントとして活躍すると、並行処理での会計システムの稼働状況を観察できる。そこで、乱数を発生させ、営業の担当者は0.1-0.5秒の間のランダムな時間に50個の商品を販売し、購買の担当…

Haskellを利用して簡単な会計システムを実現する(4)

1.取引をHaskellで記述する 勘定科目が用意できたので、簡単な取引が行えるようにする。この会計システムを利用する人は、小さな会社にも関わらず、購買の担当者、営業の担当者、会計の担当者、投資家の4人とする。 購買の担当者buyerは、商品を購入する…

Haskellを利用して簡単な会計システムを実現する(3)

1.勘定科目 勘定科目は、資産に関係する科目、負債(資本金を含む)に関係する科目、費用に関係する科目、売上に関係する科目に分けることができる。総勘定元帳などの帳簿をつけるときは、資産に関する科目と費用に関係する科目の現在高は借方に記述し、負債…