とりあえず始めてみようかHaskell

2012年4月2日月曜日

なんとなーくHaskellを使うと実現出来そうな面白いことにはアタリがついてるんだけど、まだPoCも出来ない状態なのでおいおいやるとして、言語自体に馴染もうかなということで割と個人的メモ。あんまりまとまった記事ではないけど「みゅおはこうやって新しいこと勉強するらしい」というのがほんの少しでも参考になれば嬉しいなー。


まずは学習のスタイルの話

本買ってスタートしてもいいんだけど、ひとまずはサラッと文字列処理をしてみたいだけなのでネット上の情報だけでなんとかしてみよう。これだけで挫折しそうなら本買うということで。ちなみに、本で学ぶなら プログラミングHaskell がいいのかな。

まずはスタート地点を明らかにする。「Haskellってよく聞く(とりわけプログラミング上の概念を説明する際に)し純粋関数型言語の筆頭とされるけど、コード読んだことないし書いたことないしMacの上でどうやって動かせばいいのかも知らない」というのが現ポイント。

んで学習の方針。Haskellの場合、その背景にある数学的な考え方や"モナド"なるものがクローズアップされることが多いのだけど、残念ながら私の場合最初に理論面から攻めると確実に挫折するので まず知るべきは

  • 処理系の構築方法(そもそもコンパイラでプラットフォーム用のバイナリ吐き出すスタイル?それとも実行エンジンにコード食わせるスタイル?)
  • 言語のシンタックス(ざっくりと)
  • いくつかの定番処理を記述するために使う言語構造や関数
と考えてる。これでレベル0状態(諸々検索しつつ、なんとか不格好ながら書きたい処理を書ける)までは到達出来るんじゃないかな。その次はHaskell使いのblogやら各種勉強会スライドやらを参考に「Haskellっぽく書くために足りないもの」というのをざっくり補完していって、ある程度慣れたらレベル1状態(リファレンスなど一次情報に近いものを中心として情報補完しつつ、ある程度それらしいスタイルでものを書ける)に到達出来そう。その後に理論面を補強して、ちゃんと裏側を分かった上で応用的なことを出来るようになれば「Haskellと仲良くなれた」と言ってよさそう。はやく仲良くなりたい。
多分、レベル0→レベル1の間で他の言語との相違点をよく考えることになるので、結果他言語への認識を深める役にも立ちそうな気がする。

書き始めるまでの環境構築の話


ざっくりまとまった情報として、まずは WikipediaのHaskell項 を読んでみる。たまに話を聞くGHCというやつが標準的処理系とあるので The Glasgow Haskell Compiler を開きつつ「どうせMacPortsにあるだろ」と思っておもむろに
$ sudo port install ghc
なんかPerlも依存関係でビルドし始めたけど大丈夫かこいつ、と思いつつ放置してGHCのマニュアル読む、と思ったけどもうちょい気になってダウンロードページ読みに行くと http://www.haskell.org/ghc/distribution_packages#macosx に「代替インストール元よりもネイティブ用のパッケージからインストールするのオススメ」と書いてあるので微妙な感じ。MacPortsでは6.10-4をインストールしようとしてるらしいけど最新stableは7.4.1となってる。後でこのへんが問題になったらインストーラ版から入れよう。

で、インストール中に少々ドキュメント読む。http://www.haskell.org/ghc/docs/latest/html/users_guide/index.html から辿っていくとGHCiというインタラクティブ版もあるらしい。まあひとまずは通常のコンパイル版でOK。
http://www.haskell.org/ghc/docs/latest/html/users_guide/using-ghc.html#id3053019 を読む感じ
$ ghc hello.hs
とすると同ディレクトリに hello バイナリが出力されるみたい(ビルドオプションはそのうちでOK。-vくっつけるとverboseぐらいでいいや)。ひとまずこれだけで実行には十分か。gccの-Iとか-lみたいなのはきっとしばらくは要らないんだろう(一方で標準ライブラリの全容も分からんけど)。


と思ったらMacPortsのビルドが
> :error:patch Target org.macports.patch returned: can't read "ghc_bootversion": no such variable
でエラー吐いて止まってた。今回は特にこのあたりから深く掘るつもりないのでインストーラ版から導入することに。っと思って http://www.haskell.org/ghc/download_ghc_7_4_1 を開いたら「ちょい待ち、GHCじゃなくてHaskell Platformをインストールしたほうが、周辺ツールと豊富なライブラリも含まれてるからほとんどの人にオススメだよ」と出てきたので http://hackage.haskell.org/platform/ に移動してパッケージインストールすることに。ダウンロード始めて150MBあったのにはびっくりしたけど、諸々ライブラリ含まれてるならしゃーない量かな。

ダウンロードに10分ほどかかるのでちょいシンタックスを調べる。

main = putStrLn "Hello, World!"

がはろーわーるどらしいけど
 main :: IO ()
 main = putStrLn "Hello,World!"
Wikipediaにはこんなん載ってるな。GHCはあくまでも処理系のページだから、言語標準自体についてはどっかにリンクありそう。と思ったら http://www.haskell.org/haskellwiki/Haskell ここへのリンクがあった。まずは Haskell 98 (2010でなく)ベースで書くのが良さそうなので http://www.haskell.org/onlinereport/ これをひらく。必要そうなとこ読んでいこう。

http://www.haskell.org/onlinereport/intro.html によるとHaskellのプログラム構造は
  • 最も大枠のもの: modules(モジュール)。名前空間切り分けたり再利用性を確保するための枠組み
  • moduleを構成するもの: declarations(宣言)。通常値(PIとか定数のことかな)、データ型、型クラス、不変情報(なんぞ?)を定義するもの
  • これらを構成する要素としてのexpressions(式)。値と静的型から成る
  • そして最も基盤となる言語構造(ファイル上での表現、つまりはプログラミング概念と切り離して考えた物理的な言語表現。リテラル種とかコメント記述とか)
ということらしい。暗黙的に宣言されてる諸々とかエントリポイント指定やらはどうしてるんだろうなぁ。
と読んでるうちにダウンロード終わってたのでインストーラ開くと「882.7MB容量使うよ」と出てきて心折れそうになるも続行。インストール自体は数分で完了。
ちなみにさきほどのイントロページによると6章で組み込みデータ型とクラスの説明、7章でI/Oを扱うための諸々が説明されるらしい。

… http://www.haskell.org/onlinereport/lexemes.html が2章なんだけど、この章立てじゃ処理系書きながら勉強していって最後にマトモに動く感じじゃねーの。

はろーわーるどだけやってお茶にごして今日は終わろう。
$ vi hello.hs
$ ghc hello.hs
[1 of 1] Compiling Main             ( hello.hs, hello.o )
ghc: could not execute: /Developer/usr/bin/gcc
なに変なとこ読み行ってんの…。
$ sudo ln -s /usr/bin/gcc /Developer/usr/bin/gcc
改めて
$ ghc hello.hs
[1 of 1] Compiling Main             ( hello.hs, hello.o )
Linking hello ...
ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame
…おんよー、インストールしてる諸々で32bit/64bit混在してるとかXcodeバンドルのものとMacPortsからインストールしたものと混ざってるあたりが原因かなぁ。まずは置いとこう。
$ ./hello
Hello,World!
はい。

0 件のコメント:

コメントを投稿