infoQのRúnar Bjarnasonさんのインタビューを読んだ感想

InfoQ に Scalazのcommiterの Rúnar Bjarnason さんが、ScalaDays2012のときにScalazなどについてインタビューをうけたのが、video付きで載ってます。*1

http://www.infoq.com/interviews/bjarnason-scalaz

最初、全部訳そうかと思ったけれど、ちょっとだけやってすぐに挫折したので、気になったところだけピックアップしつつ、自分の感想書くだけにします。



まず仕事についてのあたり

Rúnar Bjarnason is a software developer at Capital IQ, a global provider of data and analytics for financial professionals.

Capital IQ でググったら、サイトでてきましたが https://www.capitaliq.com/home.aspx これでいいんでしょうか?
ScalaとかHaskellとかF#で募集していたりするんですね。まぁやっぱり関数型言語 => 金融系 ってことでしょうか。

ちょっと話が逸れますが、そういえば他にも、 sjson 作ってたり、DSL in Action (日本語訳版 => 実践プログラミングDSL ドメイン特化言語の設計と実装のノウハウ (Programmer’s SELECTION) ) という本出してたりする、Scala界隈で有名なdebasishg さんも、blogのところに

Debasish Ghosh is the chief technology evangelist at Nomura Research Institute Financial Technologies

って書いてあって思いっきり金融系ですね。

  • In your work, you use Scala everyday?
  • Yes, everyday
  • Are you working on greenfield projects or integrating other projects? Do you have any problems interacting with people who are not familiar with functional programming?
  • Yes, so I’m mostly doing, yes, greenfield projects There’s one big project that I’m working on, that’s totally greenfield; but at the end of the day, it’s supposed to interact with a larger application

毎日仕事でScala書いてるらしいです、素晴らしいですね。


I implemented the I/O monad; and I’m surprised how many people are using it because I just thought it might be handy to have and so I implemented it and stuck it in the library and now people are using it all over the place and it’s kind of interesting

IO monad について、「とりあえず実装してみただけなのに(?) 多くの人々が使うようになって驚いていてる」的な意味でいいんですかね?そんな経緯だったとは、ちょっと意外でした。

  • So what are other features of scalaz? Is it mostly about comprehensions, monads? What features from Haskell do you miss in Scala?
  • Well, you know, having an abstraction for monads and monoids is an obvious one; and you know, that’s just a library issue; it’s not really a difference in the languages; but I mean, what I miss from Haskell when I go to Scala is laziness, that’s like the big thing that I find, that I want in Scala

Haskellとの違いやMonadについて聞かれて、"that’s just a library issue; it’s not really a difference in the languages" (ライブラリの問題で本質的な言語としての違いではない) っていうこと言ってます。つまり、Haskellと違ってScalaの場合標準ライブラリには、MonadとかApplicativeとかFunctorの型クラスが入ってないけど、Scalazのように自分で実装すれば、同等のことができるので問題ないということだとおもいます。
個人的には、
「implicit parameterでtypeclassをエミュレートできるけど、Haskellと比べて何かしら根本的にやりづらい部分もあるのかなー」
とか思っていましたが、おもったより楽観的(?)というか、そのあたりはそれほど問題視していないらしいです。

ただ、大きな違いとして、1点だけ "laziness"(遅延評価) について挙げてます。
まぁそれはもっともなんですが、(よく言われるような?)

  • ScalaにはnullがあってHaskellにはない
  • IOが型で判別できない*2

あたりは(遅延評価に比べれば)そんなに問題視してないんですかね?



次に

do you have any issues with Scala, anything that bugs you to see solved?

という質問に対して、いつくか挙げています

  • I’d like type inference to be better
  • I’d like to have kind variables; so I’d like to be able to talk about kinds in a way that is better than now and
  • I’d like to be able to do a partial application of type constructors in a much more straight forward way
  • もっと強力な型推論
  • 値としてのkind(種)
  • 型コンストラクタの部分適用


型推論が弱いっていうのは(他の関数型言語と比べれば)よくいわれることで、

  • 引数の型推論できない
  • 再帰関数は明示的に戻り値型書かないといけない

など、まぁ挙げればきりがないです。*3


kind variables ってなんとなく言いたいことわかるけど、うまく説明できる自信がないので省きます(ぇ


最後の型コンストラクタの部分適用は、ちょうどこの前 @yuroyoro さんが blog で書いてたあれです。
Scalaにおける型パラメータの部分適用 について
これが、scalazのライブラリの中だと大量に出現してうざいので、もっと短く書けるようにしたい的な話ですね。

このあたりの型推論とか型コンストラクタの部分適用については、specs2の作者の @etorreborre さんも Iterator パターンの本質 の中で主張してましたね。


ただ、今挙げた3つの点に関しては、

I don’t have any major issues with Scala,

but these aren’t major complaints, these are just little annoyances; so I have to do a little more typing than I’d like in both senses of the word

と言っていて、そこまで大きな問題とは感じてないようです。


上記の3つの問題は*4よく聞く話として、個人的には、 Haskell だと typeclass の instance が deriving できるわけですが、少なくとも現状ScalaやScalazにその機能がない*5あたりとか気になるんですが、触れられてませんでした。あと、Haskell と比べた場合、最新の GHC 拡張とかわからないですけど、そのあたりで差がついてる(今後更に差がつく?)可能性がある気がするんですがどうなんでしょう。


他にも、ValidationやMonoidの説明や、マクロの話や、LensやComonadや、今書いてる functional programming in Scala の本の話など、色々話してます。そのあたりに興味ある人は、ぜひ全部読みましょう。

*1:ところで、公開されてからだいぶ経過してますが、InfoQさんこれ訳してくれないんでしょうか・・・

*2:ScalaでもIO型作ってみんながそれを使うようになればある程度可能だけれども、今のところ全然そういう文化や慣習がない

*3:やろうとしても、subtypingとかoverloadがあるので、そもそも他の関数型言語と同等のレベルまで型推論を強くできないらしい、という事情はありますが。けどやろうとすればもうちょっと強力にはできるらしいです

*4:どのくらい重要な問題かどうかは別として

*5:エミュレートしようとすればちょっとはできるのかもしれない (okomokさんのkenではやってる?)