平日夜にすごいH本をちょびちょび読む会 #1

という読書会に参加してきた.

イベントページ → http://partake.in/events/a804cd6b-17f3-4aca-9b71-6d0a1a641765

話し合った内容のメモ

  • 読書会の頻度どうする?

  • 何を目的に読みたいと思ったの?

    自分の場合は,「型については勉強してたけど, Haskell でそれがどう使われてるのかよく分かっていないので, そこを知りたい」という感じ.

  • 読書会の進め方どうしよ?

    「1 章ずつ読んできて, 分からなかったところを話し合う」という形になった.

  • Haskell ソースコードの読み方の話

    • 関数宣言の書き方の元ネタはあるのか?

      数学では, Int から Int への関数はこんなふうに書く.

      \[f: Int \to Int\]

      これと Haskell の関数宣言部分は似てるのではないか? という話をした.

      f :: Int -> Int
      

      ついでに, \(f: A \to B\) と書いたときの \(A, B\) は集合で, \(A\) の元に \(B\) の元を対応付けるのが数学の関数だ, という話をした.

      「型と集合, 値と集合の元が対応付く」という話をしたら, 何か腑に落ちたところがあったようで嬉しい.

      実は, この考え方の延長戦上に Functor と函手の対応があるのだが, その話は話すべきときまで大事に取っておく.

    • Haskell の関数の書き方

      数学での関数の定義

      \[ \begin{align}\begin{aligned}f: Int \to Int\\f(n) = 2n\end{aligned}\end{align} \]

      と Haskell での関数の定義

      double :: Int -> Int
      double n = 2 * n
      

      の対応を書いて,「1 行目が関数の宣言であり, 型を明示した行」 「2 行目が関数の実体の定義」という話をした.

      例えば Scala だと

      def double(n: Int): Int = 2 * n
      

      と, 型宣言と定義を同時に書いてしまうし, 他の言語でも宣言と定義を同一の文で書くものが多いと思う. (C のプロトタイプ宣言とか Erlang は分けるんだっけ?) それと違って Haskell は 2 行に分ける書き方するんだねー, とか話した.