これからの
「言語」の話をしよう
 ― 未来を生きるためのツール ―


                   小泉 将久
       F# User Group - Japan
自己紹介
• 小泉 将久 (Nobuhisa Koizumi)
• F# User Group - Japan 代表
•   @nobuhisa_k
• id:Nobuhisa (はてな)
• セキュリティキャンプ2005


          #osc11do #fsharp
関数型言語に
興味のある人!
パラダイム
パラダイムって何だろう
         問題点・・・?

手続き型プログラミング
     と
関数型プログラミング
手続き型の悪いところ?

• 抽象度が低い?
• バグが発生しやすい?
• 並列計算に不向き?
• \ 美しくない!/
抽象度が低い?
              人間のための
      関数型      パラダイム




コンピュータ寄りの
  パラダイム     手続き型
関数型プログラミングとは
• 機能(関数)を中心に考える
  関数は値である(第一級) 10
• 関数は値

           func
                  “hello”

• 副作用はちょっとだけ ♥
関数型プログラミングとは

        E

    A
C
              D
    B


関数合成        高階関数
関数型プログラミングとは
バグ
     • 変数束縛
         let a = 1024
並列
     束縛したら変更できない
          変更できない


 慣れると、こっちのほうが
 プログラミングしやすい!
F#
Open Source !!
あらゆる言語を研究した
    最先端の
   関数型言語
F#
• Microsoft Research(2005~)
• マルチパラダイム
    関数型(非純粋)
    手続き型
    オブジェクト指向
    言語指向
OCaml
Haskell
Python
F#の守備範囲
F#の守備範囲
• Webアプリケーションも書ける
例)http://fssnip.net/
F#の守備範囲
• 3Dだって扱える(DirectX, WPF)
 例)F# 3DVisualization
F#の守備範囲
• Xboxのゲームも作れる
 例)The Path of Go
F#の守備範囲
• もちろん業務アプリも!
F#の守備範囲
• その他
 – スマートフォンのアプリケーション
 – バッチ処理、スクリプティング
     • スクリプト言語としてのF# - .fsx は強力だった!

 – 並列計算が得意

• Demonstration !
 –   Windows Form
 –   FSharpChart
F#の美しさ
判別共用体
                      & パターソマッチ

type Animal = Dog | Cat | Rabbit | Bird
let speak = function
    | Dog    -> "わんわん!"
    | Cat    -> "にゃーにゃー"
    | Rabbit -> "..."
    | Bird   -> "ぴーちくぱーちく"
public abstract class Animal
{
       public abstract string   Speak();
}
public class Dog : Animal
{
       public override string   Speak() { return "わんわん!"; }
}
public class Cat : Animal
{
       public override string   Speak() { return "にゃーにゃー"; }
}
public class Rabbit : Animal
{
       public override string   Speak() { return "..."; }
}
public class Bird : Animal
{
       public override string   Speak() { return "ぴーちくぱーちく"; }
}
部分適用
                   & 関数合成
                      (&型推論)



let compute = (+) 1 >> (*) 10
private Func<T, U> Compose<T, U>(Func<U, U> f, Func<T, U> g)
{
       return (x => f(g(x)));
}
private int F(int x, int y)
{
       return x * y;
}
private int G(int x, int y)
{
       return x + y;
}
public int Compute(int arg)
{
       return this.Compose(
               (int x) => F(10, x), (int x) => G(1, x))(arg);
}
測定単位

[<Measure>] type km
[<Measure>] type h

let time = 8<h>
let speed = 156<km/h>
リスト内包表記
                            (シーケンス式)

[ for x in 0..10 -> (x, pown 2 x) ]



val it   : (int * int) list =
  [(0,   1); (1, 2); (2, 4); (3, 8); (4, 16);
   (5,   32); (6, 64); (7, 128); (8, 256);
   (9,   512); (10, 1024)]
public IEnumerable<Tuple<int, int>> Pain()
{
        return from x in Enumerable.Range(0, 11)
                select new Tuple<int, int>(x, (int)System.Math.Pow(2, x));
}
モナド
         (コンピューテーション式)

maybe { let! x = Some 7
        let! y = Some 3
        return x + y }
並列計算
並列化の困難
例えば・・・
         素敵な    読 : 問題なし
         ファイル   書 : 問題あり
関数型と並列
値が変更できない
 (immutable)

Read Only !

並列化が容易!
(何も意識する必要がない)
F#なら朝メシ前!
• 標準ライブラリが
  並列計算を強力にサポート!
• Demonstration !
  画像処理を並列化しよう
 –画像処理を並列化しよう
おすすめ書籍
コミュニティ
• F# User Group - Japan
  http://tinyurl.com/fsugjp
  – メーリングリスト
  – Lingr
  – Wiki
  – twitter : #fsharp, #fsugjp

• MSDNフォーラム : Visual F#
F#の街
さっぽろ
なまら
F#しようよ!
Q&A

• なんでもどうぞ!
• 展示会場にF#のブースもあります!
λ




    おしまい


              小泉 将久
           @nobuhisa_k

これからの「言語」の話をしよう ―― 未来を生きるためのツール