2014-03-23

【順次追記中】すごいH本 珠玉の名言集

Lipovaca, Miran 著『すごいHaskellたのしく学ぼう!』を読んでいます。

いわゆる『すごいH本』というやつですね。





この本を読んでいるあいだはおもしろすぎで脳汁プッシャーヘブン状態なわけですが、気に入った一文をメモしているうちに珠玉の名言集ができていることに気がついたので紹介していきます。

ではまず1番「すごい」と思った名言から。



Best Word of Wisdom


Haskellでは再帰が重要です。なぜなら、 Haskellでは命令型言語のように計算をどうやってするかを指定するのではなく、 求めるものが何であるかを宣言して計算を行うからです。Haskellの目的は、 計算を実行するステップをコンピュータに示すことではなく、 欲しい結果が何であるかを直接定義することであり、 そのために再帰的な方法をよく使うのです。

これぞ珠玉。

「計算を実行するステップをコンピュータに示すことではなく、 欲しい結果が何であるかを直接定義する」。僕がプログラミングを初める前にもっていたプログラミングのイメージってそんな感じでした。

後日、小島寛之さんのエッセイ『世界を読みとく数学入門』を読んでいて気づいたのですが、この「ほしい結果が何であるかを直接定義する」という恩恵は非常に強力で、数式を眺めるていると「ふむ、Haskellに落としこむならこうかな」という類推が簡単にできちゃうのです。

「巨人の肩に乗る」ことにかけて数式をコードに翻訳してしまうことほど手っ取り早いことはないでしょう。ただそれを使いこなせるかどうかは別ですけどね ;)




Favorite way of programming


「基本的で、 明らかに正しい関数を組み合わせて、 より大きな関数を組み立てる」

これはうなずいてしまう人も多いのではないでしょうか。

僕は他の手続き型言語を書いている時もできるだけ細かな処理ごとに関数に切り分けていくほうが「好き」なので、この文化はかなりしっくりきました。

余談ですが初心者向けに「同じ処理を2回書いたら関数にまとめましょう」と言われることもありますが、あの言い方はよくないと思うんですよねー (方便だとはわかりつつも)。




Not statement, it's expression


Haskellのifは必ず値を返す式であって、 文ではないのです。

これは Haskell の if 式がかならず else をつけなければならない理由として述べられていました。

手続き型で書いている時もできるだけ if else で書き分けたほうがいいよなぁと漠然と思っていたのですが、言語仕様にまで落とし込まれているのを知って驚きと嬉しさがありました。




Well-polished naming


Stringは、 [Char]の単なる別名です。

型クラス周りのエレガントさ。この命名にも萌えました。

ghci> :t 'a'
'a' :: Char
ghci> :t "a"
"a" :: [Char]





Amazing infinite list


次のように無限リストを使うほうが良い方法です

無限リストは、もうあれですね。「うおー、遅延評価強えぇ!」感。

感動のあまり 気づいたら FizzBuzz 書いてた。入門書読んでてこんなに FizzBuzz が書きたくなったのははじめて。




Feels safe without effort


「ヘイ、 分からないなら教えてあげるけど、 この式はこの型なんだよ! 」

型注釈について。

基本は Haskell に任せて、必要なときにだけ教えてあげるっていう設計思想は静的型付の堅牢さとのバランスがすばらしい。

ghci> (read "5" :: Float) * 4
20.0





What a beautiful expression


fn x = ceiling (negate (tan (cos (max 50 x))))fn = ceiling . negate . tan . cos . max 50 と書けることについて。


素ん晴らしい! ポイントフリースタイルにすると読みやすく簡潔になることが多々あります。 データよりも関数に目がいくようになり、 どのようにデータが移り変わっていくかではなく、 どんな関数を合成して何になっているかを考えやすくなるからです。
単純な関数から始め、 関数合成を糊として使うことにより、 より複雑な関数を作り出せばよいのです。

確かにすんばらしい! こういうプログラミングの書きたさ、読みやすさ、楽しさみたいなのを提供してくれるのはとてもよいです。

ラムダを簡潔に書けたり、カッコを減らせたり、そういう部分がサポートされているのはすんばらしい (関数合成と関数適用演算子)。

関数合成はいじくっているうちに、だんだんメソッドチェーンに見えてきました。適用の向きが逆ですが、楽しさはいっしょです :)




Good joke


再帰が何なのかまだよく分からないなら、 この段落をもう一度読んでください。
(冗談ですよ! )

再帰的ジョーク。笑ったのはもう1個次のやつも。


\は思いっきり目を細めるとギリシャ文字のラムダλに見えますよね。

無理矢理感w

無理矢理感といえばこちらも。


あなたが通りを歩いていると、 老婦人が近づいてきて言いました。 「すみません。 各桁の数の合計が40になる最初の自然数は何でしょうか? 」

老婦人w



Tips: How to write where's Indent


最後に名言とは関係ないのですが、すごいH本を読んでいてハマったところが1箇所だけあったのでその回避方法を。

where はインデントをそろえないとコンパイルエラーを起こすのですが、その規則が分かりにくいので次の例のように改行して定義してしまったほうがよさそうです。



※ サンプルのインデントが大きくなっちゃってるのは space 2 にしてもなぜか gist が勝手に tab 8 にしてくれるから...orz