「勉強会に行ってみた!」第25回「Swiftのために『すごいHaskellたのしく学ぼう』を読む会」
event

「勉強会に行ってみた!」
第25回「Swiftのために『すごいHaskellたのしく学ぼう』を読む会」

2016.05.23

今回はざっくりいうとSwiftの勉強会です。なんですが、そのためにHaskellの本を読もうという読書会なのです。すごく珍しくないですか? いったいどういうことなのか、お邪魔してきました。

(三土たつお)

今日の会場は、東京の三田にある「三田いきいきプラザ」の集会室でした。

いってみれば港区の公民館のようなところですね。集会室はこんなです。

いい雰囲気ですね。

■この勉強会の趣旨とは

最初に、主催の金原(きんぱら)さんから挨拶がありました。

主催の金原さん

趣旨としては、関数型言語としての特徴も持つ Swift を読み書きするにあたって、Haskell を学ぶことで関数型のエッセンスを取り込もうということのようです。

読書会は、まずはグループに分かれてグループごとに自由に読んでいくというスタイルで行われました。

読む本はこれですね。「すごいHaskellたのしく学ぼう!」。Haskellについて、とても砕けた文章とゆるいイラストで解説した「Learn You a Haskell for Great Good!」という英文のサイトと、それをもとにした書籍を日本語訳したものです。

モナドやファンクターといったHaskellの言語要素が、とても具体的にステップを追って書かれている読みやすい本です。

■本の読み進め方はどんなふう?

それでは、各グループでどんなふうに読書が進められているか、それぞれ見てみることにしましょう。

このテーブルでは、本を最初から順番に読み進めるのではなく、気になるところをピックアップして議論するというスタイルで進めていました。面白いですね。

そのとき話していたのは、Haskell の let 構文が、Swift の計算型プロパティのネストにちょっと似ているなという話でした。ちょっと具体的に見てみましょう。

Haskell の let はたとえばこんなふうに使われます。

cylinder :: (RealFloat a) => a -> a -> a
 cylinder r h =
  let sideArea = 2 * pi * r * h
    topArea = pi * r ^2
   in sideArea + 2 * topArea

これは、円柱の表面積を計算する関数 cylinder の定義ですね。Haskellに詳しくなくてもなんとなく分かるかもしれません。円柱の半径を r、高さを h とすると、表面積は側面の面積(sideArea)+底面の面積(topArea)×2です。let は、「ただし側面の面積(sideArea)は2*π*r*hである」みたいに、この関数の定義の中でしか使わない変数を定義するために使います。この場合の sideArea という変数は外の名前空間を汚さないということですね。

対して、Swiftの計算型プロパティは、あるオブジェクトなどのプロパティが他のプロパティから計算で導かれるときに使います。たとえば、人の年齢というプロパティは、生年月日という別のプロパティから導ける、というようなイメージです。ここで、計算型プロパティはネストすることができて、ネストの内側の計算型プロパティはそこでしか使われません。letと同じように、外の名前空間を汚しません。そこが印象として似ているという感想のようでした。

Swiftというすでに知っているものを手掛かりにして、知らないものを把握しようとする、というアプローチなのかなと思いました。

同じことを実現しようとしても Swift だとちょっと冗長になるけど、Haskell だとムダな記号が少なくて読みやすいなあ」という感想も聞こえました。確かに、そういうことはあるかもしれません。

こちらのテーブルでは、Haskellと同等のコードをSwiftで書くとどうなるのか? というような話をしていました。そのとき話題になっていたのは、Haskellのこのコードです。

doubleMe x = x + x

x を受け取って、x+x を返す、つまり2倍にする関数 doubleMe です。なんてことない定義に見えますが、xの型がどこにも書いてないというところがポイントです。Haskellの場合は、右辺の + をもとに、xがNumという型クラスの型であることを推論できちゃうので型の明示がいらないわけですが、これをSwiftで同じように書くことができるかどうか。

Swift で頑張ってやろうとするならジェネリクスを使うことになるだろう、ということで次のようなコードを書いていました。

ただ、これは add(1) だと動きますが、add(1.1)だと動きません。なぜなら、IntegerArithmeticType は整数に限るからです。HaskellでいうNumにあたる、もっと広い意味の数を表すクラスが Swift にあるかな、と探していましたが、なかなか見つからないようです。自分でプロトコルを定義してあげないかぎり、同じようには書けないのかな・・というようなことを話していました。

こちらのテーブルでは、本を最初から読んで行くというスタイルでした。最初のうちは足し算とかかけ算みたいな単純な計算が続くのですが、そのうちリストの内包表記というのが出てきます。内包表記って、Swift にあるっけ? 他の言語だとどうだろうといような話をしていました。

内包表記はこんなやつですね。

[x*2 | x <- 1="" 10="" p="">

この場合だと、1から10までのリストのそれぞれを2倍したリストを表現しているので、
2から20までの偶数を含むリストが返ります。便利ですよね。内包表記というだけならPythonにも一応あって、たとえば同じ配列は

[x*2 for x in range (1,11)]

のように書くことはできます。Swiftには言語の要素としてはなさそうだ、というような話をしていました。

■学んだことの共有

こんなふうにして1時間が経ちました。主催の金原さんが各テーブルを回って、ここまでで学んだことをテーブルごとにヒアリングして、共有していました。

「このグループではどんなことをやっていましたか?」と金原さんが聞くと、たとえば「 doubleMe の定義を Swiftでやろうとして、難航しました」のようなことをグループの人が返します。それに対して金原さんが、またなにかフィードバックを返すという形ですね。

その後は、引き続き各グループで同様のスタイルで読み進め、議論を行っていました。

■まとめ

Swiftをよりよく読み書きするために、他の言語を学ぶというのがとても面白いなと思いました。Swiftは、関数型のスタイルを前面に押し出したコードで書かれたライブラリもあったりして、そういうのを読みこなすためにも関数型言語を勉強しようと思った、という参加者の方もいました。

一人で読んでいてもいいのですが、みんなで読むと、かならず自分より分かっている人がいるので、その人に聞けるというのがいいですよね。あるいは、同じレベルの人と意見を交換できるのもいい。自分の間違いに気づいたり、新しい視点をもらったりできます。読書会、いいものですね。


今回行った勉強会:
『Swiftのために「すごいHaskellたのしく学ぼう」を読む会 ver16.5.13』
http://swift-haskell.connpass.com/event/29902/

原稿:三土たつお
1976年生まれ。プログラマー、ライター。プログラマーとしてはふだんPHPを書いています。ライターとしてはニフティのデイリーポータルZとかで書いています。
著書に「街角図鑑」(実業之日本社)など。
http://mitsuchi.net/

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW