bitterharvest’s diary

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

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

オイラー・プロジェクト紹介

1.猛暑の過ごし方 地球温暖化の兆候なのだろうか今年の夏はとても暑い日が続いている。その日の最高温度が35度を超えると猛暑日と呼ばれるが、東京では、7月31日から8月7日までの8日間連続で猛暑日を記録し、これまでの記録を更新した。オーストラ…

パズル「カードの三角形」を内包表記で解く

1.カードの三角形 イアン・スチュアートさんが書いている「数学の秘密の本棚」に「カードの三角形」というパズルがある。パズルは「1から15までの数字を書いた紙がある。これを三角形に並べたい。ただし、それぞれのカードがその下にある2枚のカードの差…

Haskellをインターネットで学ぶ

1.序論インターネット時代になって、自習自学することがとても容易になった。大学での講義内容が詳しく紹介されていたり、その分野の専門家が入門者向けにやさしく紹介する動画が提供されたり、WikiPediaにみられるように体系的な知識としてまとめられたり…

見やすくするならレコード

1.タプルとレコード 複数のデータで一つのデータが構成されるということがよくある。製品と部品、団体とメンバーなどがその例である。タプルは構成要素となっているデータを列挙することで、複合的なデータを表すことができる。しかし、プログラム作成後時…

小学生に戻って旅人算(内包表記、遅延評価)

1.旅人算 流水算と似た問題に旅人算がある。旅人算には、①出会うときを求める問題と②追いつくときを求める問題の二種類がある。前者は、離れたところから二人の旅人が相手の方向に歩く場合である。後者は、一人の旅人が先に出発し、別の旅人が先の旅人を追…

ガタガタ(型々)とうるさい複素数

1.分野向けの型を作成する Haskellでは、整数や小数などの一般的な型は提供しているが、それぞれの応用分野で用いられる型は用意してない。電気・電子の分野では複素数で表すと便利な時があるが、Haskellでは複素数は残念ながら用意していない。ここでは、…

ガードをかためて連立方程式を解く

1.場合分け 答えを導くのに、場合分けしたいときが多い。前の記事で説明したパターン照合も一つだが、もう一つの方法にガードがある。今回は連立方程式を解くときに、ガードを用いることとする。 2.連立方程式 連立方程式は、 \begin{align*} ax + bx = …

流水算を解く(TypeとTuple)

1.流水算とは 小学校の頃を思い出して、今回は、流水算。川を上り下りする船の所要時間を知って、川の流れの速さと船の静水時の速さ(水の流れがないときに船が進む速さ)を解く問題である。この問題には、前提があって、次の式が成り立っていると想定してい…

Haskell入門 型があってのHaskell

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

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

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

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

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

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

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

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

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