著作一覧 |
みんな大好き関数型言語のイベントで、時間もどうにかなりそうなので参加した。
以下レポート(自己紹介とかは省略します)。想像で補っている部分あり。
三村さんの関数型言語の魅力と種類
特徴 ・ラムダ計算がベース ・関数がファーストクラス ・高いモジュール性 例)Haskell ・純粋関数型=副作用がない ・遅延評価=必要になるまで計算しない ・静的型+型推論 (この型がきたらこの処理というのが静的に決まっている) ・モナド=副作用をごまかすための再発明 Real World Haskell: Code You Can Believe In(O'Sullivan, Bryan) ・実践的な(例:ネットワークプログラミング)プログラミング ・ラムダ計算=構造が3種類のみ ・変数 ・関数適用 ・関数生成 ・関数生成 ・関数=ラムダ式に名前をつけたもの ・関数適用 ・ファーストクラスオブジェクト ・関数を受け取る関数(定番はmap) ・カリー化 ある関数の引数の一部に値を適用させた関数を返すようにすること 引数を2つ以上取る高階関数 (厳密には1個しか受け取れない) ・モジュール性 関数を部品として組み立てる 例)文字列中の単語を数える→文字列を空白で区切った配列を返す関数 +配列の要素数を返す関数 関数合成 関数を組み合わせる: 対象領域が小さい→テストが楽 組み合わせのミス(型)はコンパイラが指摘 ・Haskellの特徴まとめ ・ラムダ計算がベース ・関数がファーストクラスなので組み合わせる ・純粋関数型なので考えることが少ない←副作用がないので状態の意識が不要 ・型が味方となる ・流行りそうな言語を予想 ・Arc ポールグレアムが作った、クィックアンドダーティ用のクィックアンドダーティ言語 ・Pure 見た目がHaskellな動的言語+LLVM+置き換えベース評価式 置き換えベース例) two = x + y; two; → x+y x = 1; two; →1+y y = 1; two; →2 ・Clojure JVMで動くLisp(SchemeとCommon Lispの中間くらい) 並行プログラミングを意識 末尾最適化はしないのでrecurを使う → Pragmatic Bookshelfで3月頃 ・選択基準 ポールグレアムが好き→Arc LLVMやCの拡張に興味あり→Pure Javaと離れられない→Clojure
「〜とは〜です」という言い切り説明がうまかったと思う。
森田さん(id:emeitch(エメイッチ))のLisp創世にみるプログラマの価値
John McCarthyは、Lispの発明者。では、最初の実装者は? Steve Russell 1937年生まれ。Spacewarの開発者として有名。 Steveの功績 ・McCarthyは論文のための計算モデル記述用にLispを考えた(だけ) ・Russellがプログラミング言語として実装するアイディアを出す → McCarthyにたしなめられる ・でも、機械語を書いて実装 Lispがプログラミング言語として使えるようになったおかげがたくさん。 ハッカーと画家 コンピュータ時代の創造者たち(ポール グレアム) (出ている) 「実装には人の心を動かす力がある」
いい話。いずれにしても実装は重要。
もっともメインフレームでは機械語でプログラミングすることはそれほど難しいことではないよ、とおれは思うし実感として知っている(アドレッシングとか単純だし)のであったが(3番目の部分。20代くらいの人にとって実感できるイメージとしては、Eclipseとか使わなくても自分でantスクリプト書けばビルドできるよ=アセンブラなくても自分で機械語書けばプログラミングできるよ、程度ですな。それはそれとしてFORTLRANで実装したんじゃなかったけなぁ?)、でも2番目のところ=実装できるんじゃないかと突き進むところ、は確かにすごいよね。
ここで飲み物スタート。nobsunにいろいろ聞いたり。
突然インタビュー:(ALGOL脳からHaskell脳への切り替えについて) Q: 最初の言語がHaskellってことはないですよね? A: Turbo Pascal Q: ALGOL系のどまんなかじゃん A: 次がC++で、それからC A: あ、でもSICPは読んでた。メイヤーの本はしっくり来なかった。 A: オブジェクトはなんだか中身はわからないが呼べばその振る舞いをするとか Q: カプセル化 A: なんだ、関数じゃん。 Q: なるほど。……でも複数のインスタンスを扱うには A: そういうことは考えない Q: (なんとなくわかるような気がしている)状態遷移とかだと A: 関数を返す Q: (さらになんとなくわかるような気がして)だから関数がファーストクラスオブジェクトであることが必須なのか。
西川さん(id:nskj77)のArrowの話
・Arrow→計算を抽象化: コンピネータにより組み合わせて複雑な計算を実現する ・モナドには2種類ある ・副作用のコンテナ ・インターフェイス ← Arrowのgeneralization ・関数はArrowのインスタンス この後がやたらとおもしろかったが、書けない。 タプルってこう使うのか、というのが印象的。 質問コーナー: nobsun: Control:Applicativeのほうがわかりやすいのではないか? nskj77: すみません。勉強不足でそれはわかりません。
引き続きnobsunインタビュー
例に出てきたエラトステネスのふるいでは、無限リストから2で割り切れる数を除外したリストを引数にして、それに3で割り切れる数を除外したリストを引数にして……というのが出てきたのに関連して。
・遅延評価→考え付いたことをそのままプログラミングするために必須な機能 (遅延評価がなければ、無限リストは扱えないので別のアルゴリズムを考 え出す必要がある。遅延評価があればそんなことはしなくて良い)
以下LT
id:yuum3さん ・require 's' ・s %% s-ex % 文字列ですけど。 須藤さん ・咳リスペクト時代 druby -> dsm erb -> esm rinda? -> tsm RWiki -> wsm (sm……Scheme) 関数型:宣言 GaUnit: 定義によるテスト 牛尾さんと羽生田さん Scala! Scala! Yoshioriさん Pythonのワンライナーテクニックを使えば、文が書けないPythonのlambdaを使いこなせるよ(西尾さんリスペクト)
そういえば、なぜか時間内に終わってもドラが鳴りまくるので変だなと思ったのだが、家に帰ったらmrknさんからの札幌Ruby会議のIRCログが届いていて読んで氷解。もう、ゴングが鳴らされるかどうかにスリルとサスペンスを追い求める時代は過ぎ去ったのだな。
つまり、属人化重要ということですね。
ジェズイットを見習え |
ああ、これ今日だったのですね。<br>>それはそれとしてFORTLANで実装したんじゃなかったけなぁ?<br>わたしも最初の実装はFORTRAN (IかII?)だと読んだ覚えがあります。<br>たしかバイナリはどこかに残ってるという話だったような。<br>どちらかというとソースの方を見たいんですが(^^;
もう一回調べてみたところ、どうもアセンブリ言語の方がただしいっぽい情報が見つかりました。<br>連休中にでも調べるとします :)<br>http://www.softwarepreservation.org/projects/LISP/LISP1.5-Bonnie-sBirthdayAssembly.pdf<br>http://www-formal.stanford.edu/jmc/history/lisp/node3.html#SECTION00030000000000000000
おお、なるほど。というよりもリストのコメントを見ていて気づいたのですが、当時のLisperは、カードでS式を食わせていたんですね、当たり前かも知れないけど目からうろこ。
ご参加いただき本当にありがとうございました!<br>オブラブのイベントでは、時間切れの「終了!」の意味と<br>時間内に終わっても「ありがとうございました☆」の意味を込めて、<br>発表者全員にドラを鳴らすことにしています(´ー`;)<br>artonさんにもドラ鳴らしたいのでぜひまたご参加ください!
そういう理由だったんですか。というか、みんなナガタさんがバチを当てるところを見たいんだろうなぁとは思うけど。<br>また、参加しますね!
とか能書き書いてるよりも、いいイベント(内容おもしろかったし会場の雰囲気もおもしろかった)をどうもありがとうございました。とお礼を書けよと自分にツッコミ。