★テーマ
こわくない関数型言語

●スピーカー
中野 圭介 氏
上野 雄大 氏
水島 宏太 氏

司会:
竹迫 良範 氏



●関数型言語ってこわい?(中野 圭介 氏)
 ○関数型と私
  ・学部時代は関数型と無縁
   ┗C、Pascal、Perl
   ┗大学院時代に関数型に触れる

 ○関数型言語の基準は?
  ・関数が値として渡せる?
   ┗高階じゃないと関数型じゃないの?
   ┗参照透過性がある?
   ┗副作用が隠蔽/分離されている?
   ┗型推論の機能を持つ?

   A.問題が不適切
   ┗関数型とは、プログラミングスタイルの一つ
   ┗関数型プログラミング(FP)
   ┗言語には依存しない概念
   ┗FPに向いている言語というのはある

 ○そもそも関数とは
  ・プログラムで言う関数とは異なる(数学的な関数)
   ┗関数F=(1,5),(2,4),(3,6)
   ┗悲関数F=(1,4),(1,5),(2,4),(3,6)
  ・関数か否かは集合次第
  ・他の関数が悲関数になる恐れ
  ・影響を考えて関数化するべき

 ○言語が関数型?
  ・プログラム内のどの手続きも関数?
  ・入出力の集合は?
   ┗型付き言語ならそれが集合?
 
 ○では関数型とは?
  ・プログラミングスタイルへの形容
   ┗言語に関係なく実現可能
  ・「関数型プログラミングが記述しやすい言語」という意味でなら「関数型言語」と呼んでもいいと思う

 ○関数化すると何が嬉しいの?
  ・モジュール化がしやすい
   ┗再利用性の向上、並行計算との相性
   ┗検証など最新の研究の恩恵が得られる
   ┗要検査、モデル検査
  ・トイプログラムしか書けないのでは?
   ┗飛行機だって飛ばせる


  実装したいプログラムを関数型で記述するには言語特有の便利な機能に慣れる必要があるが、その背景となる理論まで理解する必要はない。




●こわくないSML#(上野 雄大 氏)
 ○SML#とは
  ・東北大学で開発している日本発のML系関数型言語
  ・1993年に開発開始、2013年リリース
  ・Standard MLをもとに作っている

 ○関数型言語を「実用的な言語」にすることが目的
  ・print1つ出すだけでも一苦労
  ・C言語のような物と関数型言語の溝を埋めるのがSML#
  ・CとSMLを行ったり来たり
   ┗SML#はCを呼べる
   ┗POSIXスレッドを使う   
   ┗Cとの互換性が近い
  ・OpenGLとの連携
   ┗OpenGL等を使ってのアニメーションとかも簡単に出来る
  ・多言語プログラミング
   ┗一つの言語で全てを書ききらねばならない訳ではない
   ┗手続き的な処理はCで

 SML#は「普通の言語」を目指したい。
 ML系の関数型言語。
 コンパイラもパッケージを用意している。



●こわくないScala for Java programmers(水島 宏太 氏)
 ○Scalaのイメージ
  ・Scalaは恐い?
  ・関数型言語とのハイブリッド
  ・Scalaz
  ・Scalaの人恐い

  関数型の概念を理解する必要があある


 ○誤解① 関数型の概念を理解する必要がある?
  ・もちろん理解した方がいい
  ・最初から全て理解する必要はない
  ・タイプ数が少ないJavaになることを恐れない
  ・少しずつ考え方を変える
  ・第一級の関数の活用
  ・ループからの再起、再起からの高級関数へ
  ・Scalaの関数型プログラミングのサポートはJavaプログラマに理解しやすい
  ・第一級の関数=無形クラスのインスタンス
   ┗展開された状態を理解すれば、理解しやすくなる


 ○誤解② impilctなんとかを使いこなす必要がある
  ・スクラッチから書く時には必要ない
  ・Scalaのコードを読む時は知っていると良い
   ┗読む時になってから勉強すればいい
   ┗最初から全部知ろうとはしなくていい
   ┗それで「分からない」と思って諦めてしまうのはもったいない

 ○誤解③ 関数型のコードを書かないと叩かれる
  ・一部にそう言う人はいる
  ・多くの人は普通に教えてくれる
  ・「教えたがり」な人は意外に多い
  ・言葉遣いが端的になる人も多いが、怒っている訳ではない


 ○誤解④ Scalazという難しいライブラリを普通に使う
  ・そんなことはない
  ・コアなライブラリ作者が使っていたりする
   ┗使いこなせると便利なので
  ・普通のプログラマには必要ない
  ・Scalazさえなければ・・・と諦める人も海外にいる。
   ┗そこは勘違いしない方がいい


 ○おススメ書籍
  ・Scalaスケーラブルプログラミング第2版
   ┗通称コップ本
   ┗分厚いけど、丁寧な解説がある
  ・Scala逆引きレシピ
   ┗コップ本とセットでおススメ
   
 
 ○プログラミング経験のない人にはScalaはおススメしない
  ・Javaをやったことがない人でも多分理解は出来る
  ・RubyからScalaに移った人もいた
 
 ○おススメのIDE
  ・IntelliJ IDEA
   ┗ScalaからJSONを簡単に生成出来たりする
   ┗Scalaに関してはEclipseよりも使いやすい
 
 ○ScalaでSQLを扱う
  ・squeryl、slickが人気を二分している
  ・slickが公式に推されている物なので、これから主流になるかも

●質疑応答
 Q.Scalaを初心者におススメしない理由は?
 A.ちょっとエラーがあったりすると、JavaAPIの知識が必要になることもある
   ┗Scala自体の学習とJavaライブラリの学習と両方必要
   ┗プラグラミング未経験の人だと混乱する
 

●最後に
より深いところまで理論的に勉強したければ、独学では難しい。
導入段階からそこまで考えない方がいい。

2~3人で触ってみて、それを布教するのが理想的。

まずは使ってみること。
勉強しなきゃ出来ないと思っているのが残念。

あまり関数型というのを強調しないこと。
「関数型を勉強しよう」ではなく、「OCamlを勉強しよう」とか、「便利な言語らしいからこれを勉強しよう」とか思って始めて、その過程で書き方を知る。

最初から全部を理解して始める必要はない。
Cとかを始めた時も、最初からすべて分かっていたわけじゃないはず。




●感想
関数型言語は今最も興味のあるキーワードの一つなので、行ってみた。
一番印象に残ったのは関数型は「プログラミングスタイルへの形容」という話。
別に関数型言語でなく他の言語でも関数型プログラミングは出来る。
その関数型プログラミングに向いている言語が一般的にいう「関数型言語」なのではないかということだった。

あと、Scalaについては独学でやっているところなので知っている話もあったが、今後勉強していく上でも参考になった。

関数型言語は前々から「次に来る言語」として紹介されることも多いので、今後も学習を進めつつ、注意深く動向を見ていきたい。