すごいHaskell 読書メモ #1

2015年10月4日日曜日

前置き

3年半ぐらい前にHaskell公式サイトのオンラインドキュメント(どちらかというと仕様書に近い)からHaskellを学ぶという取り組みをしていたのですが見事に頓挫(http://www.muo.jp/2012/04/haskell_03.html)していました。これはその続きの勉強の話です。

すごいH本

(´・_・`)氏訳の「すごいH本」は1年半ほど前に*1物理本を買い、少しずつ読んでいました。
これは評判に違わぬ良い本で、私から(純粋)関数型プログラミングに対する恐怖感というかつらそう苦しそうという先入観を取り払う役目を担ってくれました。型クラスの説明あたりまでしか読み進んでいない状態でずいぶん時間を開けてしまったのですが、その後にScalaの勉強を始めた時に本の説明がすんなり頭に入ってきたのはこの本のおかげだと思っています。
[*1] 確か、tanakhさんにお会いしてその帰りにAmazonで注文したような憶えがあります。

ない…!

1ヶ月少々ぶりに読もうと思ったんですが、どうも見つからない。
自宅の机のうえで手の届きやすい場所へ置いておいたはずだけど全然見つからない。
家の中をひっくり返して探してみても見つからない。
もしや1ヶ月ぐらい前に数日間アメリカへ行ってきた際の移動時間用に持っていったっきりなのでは、と思い始めました。移動中は結局他のことをやっていて読まなかったため、とても記憶が曖昧です。
(中略)
探すのを諦めて達人出版会の電子版を追加購入しました。本をなくしたのは何年ぶりだろう。

そういうわけで

以前取ったメモの再構成を交えつつ勉強していくメモです。

#1 関数の記述と適用の話

1章を読み始める。いきなりイントロへ戻ってこいと言われる。戻ってみる。ちゃんと読んだ記憶ある。手元のbrew環境にあるGHCを最新版へ念のためアップグレードしておく。
→ghci起動に失敗する、と思ったらbrew環境が全体に古かったので丸ごとアップグレードした。このとき、コマンド実行でコケていたけれど単純にgmpのリンクが切れてるっぽかったのでunlinkしてlinkし直したところうまくいった(brewにありがちなこと)。
/=演算子を2値が等しいかの判定に使っててふぁぁぁと思ったけど、これあれか、≠か。5 /= 55 / 5 == 0で0をC的に真偽判定してFalseという例かと読んでから気付いた。
関数が2引数のときは、関数を``で囲うことで中置関数として呼び出せる。例えば92 `div` 10、なるほど。これよく使われるのかな。
関数の適用は優先度的に明確である限りは括弧無しで引数指定するようなので注意していく*2
[*2] ちなみに、試してみると元々中置関数の - や * を``で囲むと単純にparse errorとなる。
文字列リテラル(というのかまだ知らない)をシングルクォートで囲うと、「TemplateHaskellを使おうとしたのん??」と問われるのでそのうち解消しよう(なんかモジュール要るやつをおせっかいしてくれるのかなGHCi)
  • Haskellでのif式にはelse節が必須
  • すべての関数は何らかの値を返す
    • 他の言語で、コードパスによっては値を返すけど他のコードパスでは返さないような、関数シグニチャと挙動の一致しない定義が許されないのと同様、Haskellのifは必ず値を返す式(文ではない)ゆえ、else必須と
ちょい先でシングルクォート(アポストロフィ)あたりの話が出てきた。Haskellで'は特別な意味を持たず、関数名の一部として有効な文字であると。なるほど。
正格版の関数というフレーズが出てきてなんぞとなったけれど、遅延じゃないと書いてあったのでそういうものだろう。'は他に、ちょい変更した関数の意で名前付けに使うこともあると。慣れないので見づらく感じるけれど、たぶん慣れてる人にとっては見れば分かるような使い分けなのだろう。
だいぶ前にやった覚えのある、Haskellの関数名は大文字で始められないよというところまで来た。引数を取らない関数を定義名前と呼ぶと。
関数呼び出し、関数定義と来て次はリストやタプルの話へ進もうというところで今回は時間切れ。続きは次回。

0 件のコメント:

コメントを投稿