top page > computer > haskell > web_lecture > for_programmer
更新日:
文責: 重城良国

1から学ぶHaskell: プログラマ向けのHaskell入門

(工事中 25%)

はじめに

純粋関数型言語Haskellを学ぶのは海の向こうの国を知ることだ。

[ザ・関数型言語のロゴ]

第一級関数、参照透過性、遅延性、静的型付けなどが特徴だ。デザインの美しさを犠牲にすることなく優れた実用性を実現している。

対象

このチュートリアル

プログラムを組んだことがあり「関数」「変数」「引数」「返り値」の意味がわかる人が対象だ。

書籍

書籍では以下のかたを、対象にしています。

書籍購入の際の注意

「誰でも理解できるように」と心を配って、書いてはいますが、それでも、理解できない人は出てしまいます。

このチュートリアルから派生した書籍は、知識はないけれど、柔軟な知性を持っている人が対象です。

書籍の内容が、1回で理解できなければ、2回読んでください。それでも理解できなければ、以下でサポートを行っています。

funpaala@gmail.com

理解できないのは、あなたが悪いわけではありません。僕の説明では網羅できないタイプの知性を持つ人も、たくさんいます。それは、優劣ではなく、ただ、タイプや背景が異なっているということです。質問していただければ、できるかぎり、答えます。

このチュートリアルについて

まずは「こみこみ」で作ろうと考えている。それから削れるところは削ろう。現在ではかなり「骨太」な構成となっている。「ごまかし」が非常にすくない内容であるので、このチュートリアルが終わった段階でかなり「きちんとした理解」が得られているはずだ。ひとつひとつの概念について「手を動かして」体で理解してもらうために、「すぶり」的な例題を多めに示した。

初心者のかたにとって、できるだけ、「ごまかしなくイメージしやすい」導入のしかたを試みた。(Web上のチュートリアルは、)まだ、まるで未完成だが、とくに、ファンクター、アプリカティブ、モナド、IOモナドあたりについては、独自の方向から説明しているので、Haskellの中級者であっても面白く、「こんな見かたもあったのか」と参考になるかと思う。

「書籍のほうは、十分な品質となっている」と、考えている。ただし、語り口は平易にしたが、骨太な内容ではある。サンプルコードと説明とを行き来して、その概念や「考えかた」を身につけてほしい。1回目に読むときは、サンプルコードを試すことに集中するのも、「あり」だろう。

書籍化

このチュートリアルの内容が書籍化されました。「Haskell 教養としての関数型プログラミング」。

書籍化とこのチュートリアル

お金を出して買っていただくことを考えて、書籍の作業を優先した結果、このチュートリアル自体のメンテナンスにまで、手が回っていない状態です。おいおい、このチュートリアルも更新していく予定です(ただし、いつになるかは、わかりません)。

さらに、独自のTLSライブラリを使っているため、HTTPSのほうが、新しめのブラウザでアクセスできなくなってしまっています。セキュリティ関連は、変化がはげしいので、「本気」と書いて「マジ」で、メンテナンスするつもりがなければ、手を出してはいけない領域だった。このページも、ゆくゆくは、Yesodあたりに移行する予定(ただし、いつになるかは(ry)。

もともとは、このページはレクチャーに使うための資料でした。レクチャーでは、このページを読みながら、言葉で説明を、おぎなっていました。しかし、書籍では、そうはいきません。よって、書籍のほうには、逐一の説明が加筆されています。

書籍の購入を迷っているかたへ

拙書「Haskell 教養としての関数型プログラミング」は、初学者にやさしい、つくりとするために、冗長な構成になっています。同じ内容を、よりコンパクトに学びたいかたには、以下のドキュメントが役に立つかもしれません。

GHC Users Guide

上記のサイトであれば、この書籍よりも、はるかに広範囲の内容が、おそらく、より、すくないページ数で解説されています。さらに、無料であり、信頼性も高い。

できるかぎり、多くの人に理解できるように、気をつかって執筆しましたが、すべての人に理解できるように書くことはできませんでした。それでも、具体的なコード例を多く、掲載していますので、手を動かして、実際に試してみることで、理解し、身につけることが可能な構成になっています。

手で打ち込むことが可能な、短めのコード例が、「お金を出して買っていただいたかたが、本書から何も得られなかった」ということを避けるための、セーフティネットとなっています。

また、理解をたすけるためと、アイキャンディーとして、オリジナルの図を掲載しています。注意深く読んでいただければ、図が何を意味するか、理解していただけるかと思います。図の意味が理解できたとき、人によっては、「アハ体験」を得るかもしれません。ただし、図の意味が理解できなかったとしても、あなたが悪いわけではありません。知性のタイプや、背景が異なるからです。

Amazonのページは、こちら

勉強会

現在、勉強会/読書会実施中です。connpassでチェック!!!お問い合わせはSlackにて。

stackのインストール

関数

多相関数

ここまでのまとめ

タプル

リストによる「くりかえし」

確認のための例題: モンテカルロ法

追加の構文1

再帰関数の基本

リストを引数とする再帰関数

リストを作成する再帰関数

リストの再帰的定義

リストを扱う標準的な関数の定義

確認のための例題: 単純なパーサ

代数的データ型

確認のための例題: NML(Nano Markup Language)

番外編: ボットを作ってみよう

Slack等の管理を普段から行っていてHubotの設定に慣れている人向けの章だ。そうでない人はこの章はとばそう。

型クラス

型の種類(kind)

モノイド

ファンクター

lecture14.hs lecture14.md

関数の変換: 引数の追加や削除

lecture15.hs lecture15.md

モナド1

lecture16.hs lecture16.md

lecture17.hs lecture17.md

アプリカティブファンクター

モナド2

IOモナド

lecture18.hs lecture18.md

Machine.hs

数値

[数値に関する型クラスの図]

作ってみよう

「Haskellを学ぶ」トップへ 「パラダイムの歴史」から読み始める


下書き

番外編

関数foldrによる定義

...

関数fix

関数fixのメモ

構文

メモ

型クラスにおける型引数に型変数しか使えないあたり(FlexibleInstancesやOverlappingInstances)についての考察が必要だ。

参考: conv.hs

ファンクター、アプリカティブ、モナドの順に説明するのではなく、ファンクター、モナド、アプリカティブの順に説明するほうが良いように思う。もともとはアプリカティブについては説明するつもりはなかった。しかし新しいバージョンでclass Applicative m => Monad mとなったので説明する必要が出てきた。ただ、そうするとモナドにならないようなアプリカティブの例を挙げるのが難しいかも。

foldrについては後回しにする。できたら最後のほうで触れたいが...。型クラスFoldableの説明などしていると大がかりになる。たとえば、続編を出せたらそこで触れたい。数値型についても続編で触れられたらいいな。

アプリカティブファンクターの説明は難しい。なぜなら、わかりやすく「モナドではなくアプリカティブである」ような例が見当たらないからだ。ZipListはたしかにモナドにはならない。しかし、Monad則を満たさないモナドクラスのインスタンスにして、そこからアプリカティブとしての関数を導くことは可能だ。なので、あまり良い例ではない。

fork_game.hs fork_game2.hs fork_gamef.hs

calculator_monad.hs state_monad.hs

subst_cipher.hs caesar_raw.hs caesar_trv.hs traverse_state.hs tmp.txt

checkSTree_raw.hs checkSTree_trv.hs

lifegame.hs

superYoshio_alt.hs superYoshio_maybe.hs superYoshio_list.hs

04_stack_install.md 04_stack_install.html

todo 全体のtodo chapter2.txt

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics