すごいHaskellをたのしく学ぼう 121124@fuji

ポップでキッチュな表紙のあの本とは直接関係ありませんが、今週末に三島Haskell無名関数の会 第一回目があるので、興味があれば参加されると楽しいと思います。というより、そろそろ関数型プログラミングの勉強会を定期的に開催していければなぁと思います。

初学者の@ando_ando_andoも参加するということなので、快適なHaskellコーディング環境をつくるという話をしようと思っています。

とりあえず、タイトルと表紙だけつくってみました。

m_lambda

それから、世界観が大切だと思うのでそういうものもちゃんと考慮してあります。

天地創造(静岡東部版)

  • 1日目 sedがある中、神はエディタを作り、vi(光属性)とEmacs(闇属性)が出来た。
  • 6日目 神は栃木と群馬をつくり、λに似せた静岡をつくった。
  • 7日目 神は休んだ。

つまり我々はEmacsを信じHaskellを推進しなければならないのです。

The Haskell Platformを2012.4.0.0にあげた

あげたら

cabal install virthualenv
cabal install hlint ghc-mod

と打って開発環境を整える。

三島Haskell無名関数の会 第一回目

11/24に三島Haskell無名関数の会 第一回目をやります(@富士)。

僕は「静岡のHaskellerはEmacsを使う」というタイトルで、初学者向けのHaskell開発環境の話をするつもりなので、Haskellに興味があるけど一歩の踏み出し方の分からないヒトは参加すると幸せになれるかもしれません(Gentooの布教活動も噂されていますが)。

それから、状態計算から理解するモナドという話をしようと思っています。

他にはYesodの話が出るそうです。

なんか話したいネタがあればコメント欄に書いておけば@ando_ando_andoが調整してくれるはず。

HaskellでFlymake

Emacs24だったらghc-modを使うのが簡単。

まずはコマンドラインツールをインストール

cabal install ghc-mod hlint

package.elからflymake,haskell-mode,ghcを入れる。M-x list-packagesでiで選んでxでインストール開始

~/.emacs.d/init.elの設定

;; haskell ghc-mod
;; https://github.com/kazu-yamamoto/ghc-mod
(autoload 'ghc-init "ghc" nil t)
(add-hook 'haskell-mode-hook (lambda () (ghc-init) (flymake-mode)))

こんだけで快適な環境が手に入る。

bottomを理解して関数プログラミングへの理解が深まった

関数プログラミング入門の8ページにいきなりbottom(⊥)の説明があって、今までよくわからなかったのが「あーそういうことかーーーー!」ってなって、第8回 遅延評価の仕組みもよく理解できたし、頭部正規形なんかもその流れでさくっと理解できた。

ProductName 関数プログラミング入門 ―Haskellで学ぶ原理と技法―
Richard Bird
オーム社 / 3990円 ( 2012-10-26 )


f(⊥) = ⊥だったら正格で、そうじゃなかったら非正格ってことですね。

::: haskell
Prelude> let two x = 2
Prelude> two undefined
2
Prelude> two $! undefined 
*** Exception: Prelude.undefined

RWHでも確か載ってたなぁと思って探したら24章の並行マルチコアプログラミングの章だった。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan
オライリージャパン / 3990円 ( 2009-10-26 )


11月の静岡はクライアントサイドの開発の勉強会が盛り沢山だ

来月の勉強会はやたらと盛りだくさんだ。

Titanium MobileはjavascriptでiPhone,Androidアプリを開発したい人にとってはよいソリューションだと思います。で、独りで開発しようと思ったらデザインとか配色とか習っておきたいのでTalkNoteは役に立ちそう。

もう少しゆるい感じのjQueryとかそっち方面に興味があれば静岡javaScript勉強会に参加すればいいいと思います。

そして、あなたが本物のプログラマならば「三島Haskell無名関数の会」が第一選択肢になるはず(ですよね?)。

(ATNDできた。)

YesodというHaskellのウェブアプリケーションフレームワークが熱く語られるという噂です。僕は「Stateモナドで理解するモナドというパターン」という話でもしようかなと思っているが、みんなモナド理解しているかもしれないから、「Haskellでつくる人工無脳」にするかもしれない。

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


次の週にはJAWS静岡 #2があるのか、、、

Haskellの幽霊型(Phantom Type)

yesodの本を読んでたら出てきたのでググった

Phantom typeによると、

class Sanitise a where
  sanitise :: FormData a -> FormData Validated

-- do nothing to data that is already validated
instance Sanitise Validated where
  sanitise = id

-- sanitise untrusted data
instance Sanitise Unvalidated where
  sanitise (FormData str) = FormData (filter isAlpha str)

ラベル付けするためにあるのかな。うまく使えれば便利そう。

How wonderful to be (statically) typed 〜型が付くってスバラシイ〜というスライドがわかりやすくて面白かった。

他にはFFIにも出てくるみたい。

ProductName Developing Web Applications With Haskell and Yesod
Michael Snoyman
Oreilly & Associates Inc / 2805円 ( 2012-05-04 )


Haskellで赤黒木

パターンマッチの強力さを垣間見た。

*Main> insert 5 empty 
T B E 5 E
*Main> insert 2 $insert 4 $insert 1 $ insert 3 $insert 5 empty
T B (T B E 1 (T R E 2 E)) 3 (T B (T R E 4 E) 5 E)

ちなみにPythonで書くとこんな感じ

ProductName 関数プログラミングの楽しみ

オーム社 / 4410円 ( 2010-06-23 )


型の本

ここらへんか?

ProductName Types and Programming Languages
Benjamin C. Pierce
The MIT Press / 6567円 ( 2002-02-01 )


ProductName Advanced Topics in Types and Programming Languages

The MIT Press / 5829円 ( 2004-12-23 )


「関数プログラミング入門 ―Haskellで学ぶ原理と技法―」は予約した

Haskellの入門書に型推論の話題が含まれていないのはなんでだろう?

最近やったことを振り返ってみると

型推論のための知識ばかりじゃないかと。メタな知識がないとまともなコード書けないってことか、コード書くのには必要ない余計な知識を詰め込んだのか(多分前者だと思うけど)。

Haskell の型システムは2つの重要 な特性を発揮します。ひとつめは、正しく型付けされた式はいづれも唯一の主型 (これについては下で説明します)を持つことが保証されるということです。ふた つめはこの主型は自動的に推論できるものであるということです(§4.1.3)。Cのように単 態型を用いる言語と比較すると、多相性のある言語では表現力がアップしている のがわかると思います。型推論機構は、プログラマが型の問題で頭を悩ますこと を軽減してくれます。やさしい Haskell 入門 (バージョン 98 )

結局のところ、型推論機構の知識がないとプログラマが型の問題で頭を悩ますだけで、Haskellの型推論機構の恩恵を受けられないよってことじゃないのかな?と思うのだけど、なぜ入門書にそういう話題が含まれていないのだろうと思った。

あちこち探しまわって断片をかき集めてちょっとづつ理解していくのはちょっとしんどいかも。

僕は楽しかったけど。

ProductName Basic Category Theory for Computer Scientists (Foundations of Computing)
Benjamin C. Pierce
The MIT Press / 2302円 ( 1991-08-07 )


ランク2多相とかランクN多相を理解する

これもわかってしまえば、分かりやすい概念かもしれないが。

GHCが暗黙の量化を行う手順は次のとおり。ユーザが書いた型の最上位(のみ)において、明示的なforallがないなら、またその時に限り、その型で言及されているもののスコープにない型変数を調べ上げ、それらを全称量化する。7.11.5.3. 暗黙の量化

をみると小難しい話なのかな?と思うが、具体例は分かりやすい。

f :: (a -> a) -> Int
         -- は
f :: forall a. (a -> a) -> Int
         -- のことであり
f :: (forall a. a -> a) -> Int
         -- ではない

なんというか数学の定義っぽいことをやっているが、代数的データ型だからそういうもんなんだろう。

ランクとはforallの深さ、つまり括弧のこと(層)のことを言っているわけである。