SlideShare una empresa de Scribd logo
1 de 79
Descargar para leer sin conexión
2010.4.17   F#λ門
Nobuhisa Koizumi
• 自己紹介
• CLR/H の紹介
自己紹介
•   K泉将久
•   id:Nobuhisa, @nobuhisa_k
•   1987年生まれの永遠の17歳
•   高2の時に独学でプログラミング
•   高3夏 セキュリティキャンプ2005
•   2006年2月 VS2005ローンチで初CLR/H
•   心理学, 生命科学, 認知神経科学
自己紹介
• C, HSP
• C++, C#
• Scheme
• VB, Common Lisp, Java,
  Python, PHP, JavaScript
• Haskell, Smalltalk

• OCaml,   F#
F# ... ?
古くて新しい言語F#
          ML

                   Caml
Miranda
          OCaml

Haskell             F#
古くて新しい言語F#
               ML
                               1987-92
                1980-81
1985-86
                               Caml
Miranda
                 OCaml
                       1996-   2005(02)-

 Haskell                        F#
           1987(90)-
C#(VB)の主要機能
C#(VB)の主要機能
• Garbage Collection
• デリゲート
  – 匿名メソッド (2.0)
  – λ式 (3.0)
• ジェネリクス (2.0)
• 型推論 (3.0)
• 対話環境 (X.0 ?)
など
C#(VB)の主要機能
• Garbage Collection
• デリゲート
  – 匿名メソッド (2.0)
  – λ式 (3.0)           1980年生まれのMLは
                       これらを全て備えていた !
• ジェネリクス (2.0)
• 型推論 (3.0)
• 対話環境 (X.0 ?)
など
F#の魅力! - マルチパラダイム

手続き型プログラミング
              関数プログラミング

オブジェクト指向

              言語指向プログラミング

 メタプログラミング
F#の魅力! - 美しい & 賢い
• Haskell, Python から得た見た目の美しさ
  – OCaml はソースが見にくいと言われていた
  – lightweight syntax

• 強く美しいパターンマッチ

• リスト内包表記 (Sequence Expressions)
  > [ for x in 1..10 -> x * 2 ] ;;

• コンパイラの最適化が高度 & 処理が速い!
F#かわいい
• 計算機科学の英知を脈々と受け継ぎ、
• Active Pattern, Computation Expressions
  などの新しい試みも加わり、
• .NET の最新テクノロジを利用でき、
  – WinForm, WPF はもちろん、並列計算も
• ソースコードがきれいで、
• 優れた開発環境で開発できる!
F#のダメなとこ!
• Express Edition がない
• 開発環境の機能が不完全
  – フォームデザイナ
  – インテリセンス、クラスビュー、 etc ...

• 日本語情報の不足
  – 書籍は現在1冊
  – OCaml の本を読んでもいいかも

時が解消してくれるかな・・・?
Install
Visual Studio 2010 !
• Visual F# 2010 Express の提供ナシ(´・ω・`)
• VS2010 Professional 以上を使おう

•   VS Shell を使おう
•   VS2008 + F# CTP を使おう
• テキストエディタ + fsc を使おう
Visual Studio 2010 !

Visual Studio Shell
• IronPython, F#, etc ...
• 2010用の提供はまだ
  (10/04/17時点)

F# CTP (Ver 2.0.0.0)
• VS2008 or VS2008 Shell
• Download details: F# April 2010 CTP
Functional
Programming
関数プログラミング
• 機能(関数)の集まりとして表現する
• 関数は第一級の扱いを受ける
• 再帰は別に本質ではない
• 副作用がない(少ない)
 – 副作用 :
  状態を変化させて結果に影響を与える
変数
変数宣言
      let itbe = ”THE BEATLES” ;;

• 値は変更できない
• 値に変数(名前、ラベル、シンボル)を束縛する


変数A                                 値
       値
                                変数
            変数B
なぜ値は変更できない?
• 状態に依存しなくなる
• いかなる状況下でも、いつも同じ結果
    – 同じ引数で呼び出せば、同じ結果が返ってくる

                     参照透明性
•   再利用性が高くなる
•   関数のテストが簡単に!
•   アルゴリズムが明確になる
•   並列計算
タプル
複数の値をひとつの値に!
• タプル (e1, e2, …, en)
> (1, 2) ;;
val it : int * int = (1, 2)
> ("one", 2, 3.0) ;;
val it : string * int * float = ("one", 2, 3.0)
> let a = () ;;
val a : unit = ()
関数
純粋な関数
 ラムダ計算においては、関数は常に一引数

関数定義:                   関数適用:
fun x -> x + 1 ;;                 f x ;;

> let myFun = fun x -> x * x ;;
val myFun : int -> int
> myFun 10 ;;
val it : int = 100
純粋な関数
 ラムダ計算においては、関数は常に一引数

関数定義:                   関数適用:
fun x -> x + 1 ;;                 f x ;;
                           複数の引数を扱うには
                            どうすればいいの?
> let myFun = fun x -> x * x ;;
val myFun : int -> int
> myFun 10 ;;
val it : int = 100
タプルを使おう!

 > let myFun = fun (x, y) -> x + y ;;
 val myFun : int * int -> int
 > myFun (30, 70) ;;
 val it : int = 100

let stream = // .NET Framework のメソッド
   File.Open ("a.txt", FileMode.Open, FileAccess.Read)
練習(fst, snd)
タプルの第1要素を返す関数を定義してみよう
> let fst' = fun (x, _) -> x ;;
val fst' : 'a * 'b -> 'a
> fst' ("first", 2) ;;
val it : string = "first"

 Keyword : ワイルドカード、総称型、型推論
練習(fst, snd)



みなさんわかりましたか??
練習(fst, snd)


   では、第2要素を返す
snd’関数を定義してください
ここからが
Functional
関数の中に関数?
λx.λy. x y
 > let f = (fun x -> (fun y -> x + y)) ;;
 val f : int -> int -> int

 > f 10 ;;
 val it : (int -> int) = <fun:it@38-6>
関数の中に関数?

> (f 4) 6 ;;
val it : int = 10

> f 1 2 ;; // 左結合
val it : int = 3

      関数を入れ子にすることで、
    複数の引数を扱う関数を表現できる!
関数の中に関数?
let add = fun x -> fun y -> fun z -> x+y+z ;;
> add 20 30 50 ;;
⇒ (fun x -> (fun y -> (fun z -> x + y + z))) 20 30 50
⇒ (fun y -> (fun z -> 20 + y + z)) 30 50
⇒ (fun z -> 20 + 30 + z) 50
⇒ 20 + 30 + 50
⇒ 100 !!
省略記法

let f = fun x -> fun y -> fun z -> x y z ;;


       let f = fun x y z -> x y z ;;


           let f x y z = x y z ;;
カリー化と
部分適用
カリー化とは?
• f (x, y, z)
  「x を受け取り、[残りの引数をとる関数]を返す」
  形に変形する

         let f (x, y, z) = x + y + z ;;

     let f x = (fun (y, z) -> x + y + z) ;;

  let f x = (fun y -> (fun z -> x + y + z)) ;;
カリー化とは?
> let f1 (x, y, z) = x + y + z ;;
val f1 : int * int * int -> int
> let f2 x y z = x + y + z ;;
val f2 : int -> int -> int -> int
> f1 10 ;; // Error
> f2 10 ;;
val it : (int -> int -> int) = <fun:it@66-7>
カリー化とは?

• ‘a * ‘b -> ‘c を
• ‘a -> ‘b -> ‘c に変換するのがカリー化
• let f x y z = ~ で定義されるのは
  カリー化された関数
部分適用とは?
> let f x y = x + y ;;      // fun x -> fun y -> x + y
val f : int -> int -> int
> let add1 = f 1 ;;         // fun y -> 1 + y ;;
val add1 : (int -> int)
> add1 9 ;;
val it : int = 10
> add1 99 ;;
val it : int = 100
練習(curry, uncurry)
‘a * ‘b -> ‘c の型の関数をカリー化する関数を定義しよう
> let curry f x y = f (x, y) ;; // 高階関数
val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c
> let f1 (x, y) = x + y ;;
val f1 : int * int -> int
> let f2 = curry f1 ;;         //部分適用
val f2 : (int -> int -> int)
> f2 50 80 ;;
val it : int = 130
練習(curry, uncurry)



みなさんわかりましたか??
練習(curry, uncurry)

                では、
‘a -> ‘b -> ‘c の型の関数を
‘a * ‘b -> ‘c の型に変換する
   uncurry関数を定義してください
List
リスト
• 単方向連結リスト
• List の定義
 – []
 – x :: List

> [] ;;                    => val it : 'a list = []
> 1 :: [] ;;               => val it : int list = [1]
> 1 :: 2 :: 3 :: [] ;;
val it : int list = [1; 2; 3]
リスト
List の定義
 – []
 – x :: List
> List.head [1; 2; 3] ;;
val it : int = 1
> List.tail [1; 2; 3] ;;
val it : int list = [2; 3]
> List.head (List.tail (List.tail [1; 2; 3])) ;;
???
リスト
List の定義
 – []
 – x :: List
> List.head [1; 2; 3] ;;
val it : int = 1
> List.tail [1; 2; 3] ;;
val it : int list = [2; 3]
> List.head (List.tail (List.tail [1; 2; 3])) ;;
val it : int = 3
Listモジュール
append      fold        iteri2   ofArray      sortBy
average     fold2       length   ofSeq        sortWith
averageBy   foldBack    map      partition    sum
choose      foldBack2   map2     permute      sumBy
collect     forall      map3     pick         tail
concat      forall2     mapi     reduce       toArray
empty       head        mapi2    reduceBack   toSeq
exists      init        max      replicate    tryFind
exists2     isEmpty     maxBy    rev          tryFindIndex
filter      iter        min      scan         tryPick
find        iter2       minBy    scanBack     unzip unzip3
findIndex   iteri       nth      sort         zip zip3
List.map : ('a -> 'b) -> 'a list -> 'b list
すべての要素に関数を適用
> let add1 x = x + 1 ;;
val add1 : int -> int
> List.map add1 [9; 99; 999] ;;
val it : int list = [10; 100; 1000]

> List.map (fun x -> x + 1) [1; 2; 3] ;;
val it : int list = [2; 3; 4]
List.map : ('a -> 'b) -> 'a list -> 'b list
すべての要素に関数を適用
> ( + ) ;;
val it : (int -> int -> int) = <fun:it@25-4>

> ( + ) 1 1 ;;
val it : int = 2

> List.map (( + ) 1) [1; 2; 3] ;; // 部分適用
val it : int list = [2; 3; 4]
List.filter : ('a -> bool) -> 'a list -> 'a list
関数の適用結果が真の要素だけ抽出
> let even x = x % 2 = 0 ;;
val even : int -> bool
> List.filter even [1; 2; 3; 4; 5; 6; 7; 8] ;;
val it : int list = [2; 4; 6; 8]

> List.filter (( < ) 4) [1; 5; 6; 2; 3; 7] ;;
val it : int list = [5; 6; 7]
定義してみると・・・
let rec MyMap f   list' =
    match list'   with
    | []          -> []
    | x :: rest   -> f x :: MyMap f rest

let rec MyFilter f = function
| []                 -> []
| x :: rest when f x -> x :: MyFilter f rest
| _ :: rest          -> MyFilter f rest



         これは何だ・・・(?_?)
パターンマッチ
パターソマッチ
let MyMatch1 tuple =
    match tuple with
    | (0, 0)            -> "zero"
    | (x, y) when x > y -> ">"
    | (x, y) when x < y -> "<"
    | _                 -> "="

> MyMatch1 (3, 5) ;;
val it : string = "<"
> MyMatch1 (2, 2) ;;
val it : string = "="
もしパターンマッチがなかったら...

let MyMatch1' tuple =
    if fst tuple = 0
        && snd tuple = 0 then "zero"
    elif fst tuple > snd tuple then ">"
    elif fst tuple < snd tuple then "<"
    else "="
パターンマッ千
let MyMatch2 list' =
    match list' with
    | []        -> 0
    | [x]       -> x
    | [x; y]    -> x - y
    | _         -> failwith "エラー!"

> MyMatch2 [13; 3] ;;
val it : int = 10
> MyMatch2 [1; 2; 3] ;;
System.Exception: エラー!
八゚ターンマッチ
let rec MyMatch3 list' =
    match list' with
    | []        -> 0
    | x :: rest -> x + MyMatch3 rest



> [1 .. 5] ;;
val it : int list = [1; 2; 3; 4; 5]
> MyMatch3 [1 .. 3] ;;
???
八゚ターンマッチ
let rec MyMatch3 list' =
    match list' with
    | []        -> 0
    | x :: rest -> x + MyMatch3 rest



> [1 .. 5] ;;
val it : int list = [1; 2; 3; 4; 5]
> MyMatch3 [1 .. 3] ;;
val it : int = 6
パ夕ーンマッチ
type Color =
| Red
| Green
| Blue
| White

let MyMatch4 color =
    match color with
    | Red   -> "あか"
    | Green -> "みどり"
    | _     -> "そのた"
pat :=
   const                            -- constant pattern
   long-ident pat-paramopt patopt   -- named pattern
   _                                -- wildcard pattern
   pat as ident                     -- "as" pattern
   pat '|' pat                      -- "or" pattern
   pat '&' pat                      -- "and" pattern
   pat :: pat                       -- "cons" pattern
   pat : type                       -- pattern with type constraint
   pat,...,pat                      -- tuple pattern
   (pat)                            -- parenthesized pattern
   list-pat                         -- list pattern
   array-pat                        -- array pattern
   record-pat                       -- record pattern
   :? atomic-type                   -- dynamic type test pattern
   :? atomic-type as ident          -- dynamic type test pattern
   null                             -- null-test pattern
   attributes pat                   -- pattern with attributes
ここからは
概要のみ
オブジェクト指向
[<AbstractClass>]
type BaseClass() =
    abstract Method1 : int -> int

type IBase =
    abstract Method2 : int -> int

type SubClass() =
    inherit BaseClass()
    override self.Method1 x = x + 10
    interface IBase with
        member self.Method2 x = x * 10
Units Of Measure
[<Measure>]            type     h
[<Measure>]            type     km
[<Measure>]            type     cm
[<Measure>]            type     cm2 = cm ^ 2

> 155<km/h> ;;
val it : int<km/h> = 155
> 5<cm> * 8<cm> ;;
val it : int<cm ^ 2> = 40
> let a : int<cm2> = 2<cm> * 10<cm> ;;
val a : int<cm2> = 20
> 1<h> + 2<cm> ;;
error: The unit of measure 'cm' does not match the unit of measure 'h'
Active Pattern
let (|S|A|B|C|) score =
    if score >= 80 then S
    elif score >= 60 then A
    elif score >= 40 then B
    else C

let GiveGrade score =
    match score with
    | S -> "たいへんよい"
    | A -> "よい"
    | B -> "がんばろう"
    | C -> "ゆとり"
Quotation
式を <@ ~ @> で囲うと、式木を得られる
Microsoft.FSharp.Quotations
> <@ let f x = x + 10 in f 90 @> ;;
val it : Expr<int> =
 Let (f,
   Lambda (x,
          Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32),
             [x, Value (10)])), Application (f, Value (90)))
  {CustomAttributes = [NewTuple (Value ("DebugRange"),
        NewTuple (Value ("stdin"), Value (5), Value (7), Value (5), Value (10)))];
   Raw = ...;
   Type = System.Int32;}
Microsoft.FSharp.Quotations.Patterns
let MyFun = function
| Var v         -> "変数だよー : " + v.Name
| Value (o, _) -> "定数値だよー : " + o.ToString ()
| NewTuple _    -> "タプルだよー"
| Call _        -> "関数呼び出しだよー"
| Lambda _      -> "λ式だよー"
| _             -> "その他"

> MyFun <@ 100 @> ;;
val it : string = "定数値だよー : 100"
> MyFun <@ 1 + 1 @> ;;
val it : string = "関数呼び出しだよー"
> MyFun <@ fun x -> x @> ;;
val it : string = "λ式だよー"
並列処理
- Demo -
PLINQ(PSeq)
    - Demo -
アクター
- Demo -
FSUG-JP
F# User Group - Japan

• http://groups.google.co.jp/group/fsug-jp
  ( http://bit.ly/fsug-jp )
• 国内最大級のF#オンラインコミュニティ!!
• お気軽にご参加ください
• Twitter : #fsugjp
(時間があまれば)
  質問タイム
ご清聴ありがとうございました
     ― おしまい ―

Más contenido relacionado

La actualidad más candente

たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについてmametter
 
LLVM Backend の紹介
LLVM Backend の紹介LLVM Backend の紹介
LLVM Backend の紹介Akira Maruoka
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版Masahiro Nagano
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたってTsuyoshi Matsudate
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 

La actualidad más candente (20)

たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 
LLVM Backend の紹介
LLVM Backend の紹介LLVM Backend の紹介
LLVM Backend の紹介
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
Map
MapMap
Map
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 

Similar a F#入門 ~関数プログラミングとは何か~

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swiftnecocen
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪yashigani
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101Nobuaki Oshiro
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
初めてのHaskell (表)
初めてのHaskell (表)初めてのHaskell (表)
初めてのHaskell (表)karky7
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターsohta
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類Tetsuya Hasegawa
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 

Similar a F#入門 ~関数プログラミングとは何か~ (20)

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
初めてのHaskell (表)
初めてのHaskell (表)初めてのHaskell (表)
初めてのHaskell (表)
 
R language definition3.1_3.2
R language definition3.1_3.2R language definition3.1_3.2
R language definition3.1_3.2
 
ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類
 
fanscala1 2 scalaの基本
fanscala1 2 scalaの基本fanscala1 2 scalaの基本
fanscala1 2 scalaの基本
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 

Último

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Último (9)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

F#入門 ~関数プログラミングとは何か~

  • 1. 2010.4.17 F#λ門 Nobuhisa Koizumi
  • 3. 自己紹介 • K泉将久 • id:Nobuhisa, @nobuhisa_k • 1987年生まれの永遠の17歳 • 高2の時に独学でプログラミング • 高3夏 セキュリティキャンプ2005 • 2006年2月 VS2005ローンチで初CLR/H • 心理学, 生命科学, 認知神経科学
  • 4. 自己紹介 • C, HSP • C++, C# • Scheme • VB, Common Lisp, Java, Python, PHP, JavaScript • Haskell, Smalltalk • OCaml, F#
  • 6. 古くて新しい言語F# ML Caml Miranda OCaml Haskell F#
  • 7. 古くて新しい言語F# ML 1987-92 1980-81 1985-86 Caml Miranda OCaml 1996- 2005(02)- Haskell F# 1987(90)-
  • 9. C#(VB)の主要機能 • Garbage Collection • デリゲート – 匿名メソッド (2.0) – λ式 (3.0) • ジェネリクス (2.0) • 型推論 (3.0) • 対話環境 (X.0 ?) など
  • 10. C#(VB)の主要機能 • Garbage Collection • デリゲート – 匿名メソッド (2.0) – λ式 (3.0) 1980年生まれのMLは これらを全て備えていた ! • ジェネリクス (2.0) • 型推論 (3.0) • 対話環境 (X.0 ?) など
  • 11. F#の魅力! - マルチパラダイム 手続き型プログラミング 関数プログラミング オブジェクト指向 言語指向プログラミング メタプログラミング
  • 12. F#の魅力! - 美しい & 賢い • Haskell, Python から得た見た目の美しさ – OCaml はソースが見にくいと言われていた – lightweight syntax • 強く美しいパターンマッチ • リスト内包表記 (Sequence Expressions) > [ for x in 1..10 -> x * 2 ] ;; • コンパイラの最適化が高度 & 処理が速い!
  • 13. F#かわいい • 計算機科学の英知を脈々と受け継ぎ、 • Active Pattern, Computation Expressions などの新しい試みも加わり、 • .NET の最新テクノロジを利用でき、 – WinForm, WPF はもちろん、並列計算も • ソースコードがきれいで、 • 優れた開発環境で開発できる!
  • 14. F#のダメなとこ! • Express Edition がない • 開発環境の機能が不完全 – フォームデザイナ – インテリセンス、クラスビュー、 etc ... • 日本語情報の不足 – 書籍は現在1冊 – OCaml の本を読んでもいいかも 時が解消してくれるかな・・・?
  • 16. Visual Studio 2010 ! • Visual F# 2010 Express の提供ナシ(´・ω・`) • VS2010 Professional 以上を使おう • VS Shell を使おう • VS2008 + F# CTP を使おう • テキストエディタ + fsc を使おう
  • 17. Visual Studio 2010 ! Visual Studio Shell • IronPython, F#, etc ... • 2010用の提供はまだ (10/04/17時点) F# CTP (Ver 2.0.0.0) • VS2008 or VS2008 Shell • Download details: F# April 2010 CTP
  • 18.
  • 20. 関数プログラミング • 機能(関数)の集まりとして表現する • 関数は第一級の扱いを受ける • 再帰は別に本質ではない • 副作用がない(少ない) – 副作用 : 状態を変化させて結果に影響を与える
  • 22. 変数宣言 let itbe = ”THE BEATLES” ;; • 値は変更できない • 値に変数(名前、ラベル、シンボル)を束縛する 変数A 値 値 変数 変数B
  • 23. なぜ値は変更できない? • 状態に依存しなくなる • いかなる状況下でも、いつも同じ結果 – 同じ引数で呼び出せば、同じ結果が返ってくる 参照透明性 • 再利用性が高くなる • 関数のテストが簡単に! • アルゴリズムが明確になる • 並列計算
  • 25. 複数の値をひとつの値に! • タプル (e1, e2, …, en) > (1, 2) ;; val it : int * int = (1, 2) > ("one", 2, 3.0) ;; val it : string * int * float = ("one", 2, 3.0) > let a = () ;; val a : unit = ()
  • 27. 純粋な関数 ラムダ計算においては、関数は常に一引数 関数定義: 関数適用: fun x -> x + 1 ;; f x ;; > let myFun = fun x -> x * x ;; val myFun : int -> int > myFun 10 ;; val it : int = 100
  • 28. 純粋な関数 ラムダ計算においては、関数は常に一引数 関数定義: 関数適用: fun x -> x + 1 ;; f x ;; 複数の引数を扱うには どうすればいいの? > let myFun = fun x -> x * x ;; val myFun : int -> int > myFun 10 ;; val it : int = 100
  • 29. タプルを使おう! > let myFun = fun (x, y) -> x + y ;; val myFun : int * int -> int > myFun (30, 70) ;; val it : int = 100 let stream = // .NET Framework のメソッド File.Open ("a.txt", FileMode.Open, FileAccess.Read)
  • 30. 練習(fst, snd) タプルの第1要素を返す関数を定義してみよう > let fst' = fun (x, _) -> x ;; val fst' : 'a * 'b -> 'a > fst' ("first", 2) ;; val it : string = "first" Keyword : ワイルドカード、総称型、型推論
  • 32. 練習(fst, snd) では、第2要素を返す snd’関数を定義してください
  • 34. 関数の中に関数? λx.λy. x y > let f = (fun x -> (fun y -> x + y)) ;; val f : int -> int -> int > f 10 ;; val it : (int -> int) = <fun:it@38-6>
  • 35. 関数の中に関数? > (f 4) 6 ;; val it : int = 10 > f 1 2 ;; // 左結合 val it : int = 3 関数を入れ子にすることで、 複数の引数を扱う関数を表現できる!
  • 36. 関数の中に関数? let add = fun x -> fun y -> fun z -> x+y+z ;; > add 20 30 50 ;; ⇒ (fun x -> (fun y -> (fun z -> x + y + z))) 20 30 50 ⇒ (fun y -> (fun z -> 20 + y + z)) 30 50 ⇒ (fun z -> 20 + 30 + z) 50 ⇒ 20 + 30 + 50 ⇒ 100 !!
  • 37. 省略記法 let f = fun x -> fun y -> fun z -> x y z ;; let f = fun x y z -> x y z ;; let f x y z = x y z ;;
  • 39. カリー化とは? • f (x, y, z) 「x を受け取り、[残りの引数をとる関数]を返す」 形に変形する let f (x, y, z) = x + y + z ;; let f x = (fun (y, z) -> x + y + z) ;; let f x = (fun y -> (fun z -> x + y + z)) ;;
  • 40. カリー化とは? > let f1 (x, y, z) = x + y + z ;; val f1 : int * int * int -> int > let f2 x y z = x + y + z ;; val f2 : int -> int -> int -> int > f1 10 ;; // Error > f2 10 ;; val it : (int -> int -> int) = <fun:it@66-7>
  • 41. カリー化とは? • ‘a * ‘b -> ‘c を • ‘a -> ‘b -> ‘c に変換するのがカリー化 • let f x y z = ~ で定義されるのは カリー化された関数
  • 42. 部分適用とは? > let f x y = x + y ;; // fun x -> fun y -> x + y val f : int -> int -> int > let add1 = f 1 ;; // fun y -> 1 + y ;; val add1 : (int -> int) > add1 9 ;; val it : int = 10 > add1 99 ;; val it : int = 100
  • 43. 練習(curry, uncurry) ‘a * ‘b -> ‘c の型の関数をカリー化する関数を定義しよう > let curry f x y = f (x, y) ;; // 高階関数 val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c > let f1 (x, y) = x + y ;; val f1 : int * int -> int > let f2 = curry f1 ;; //部分適用 val f2 : (int -> int -> int) > f2 50 80 ;; val it : int = 130
  • 45. 練習(curry, uncurry) では、 ‘a -> ‘b -> ‘c の型の関数を ‘a * ‘b -> ‘c の型に変換する uncurry関数を定義してください
  • 46. List
  • 47. リスト • 単方向連結リスト • List の定義 – [] – x :: List > [] ;; => val it : 'a list = [] > 1 :: [] ;; => val it : int list = [1] > 1 :: 2 :: 3 :: [] ;; val it : int list = [1; 2; 3]
  • 48. リスト List の定義 – [] – x :: List > List.head [1; 2; 3] ;; val it : int = 1 > List.tail [1; 2; 3] ;; val it : int list = [2; 3] > List.head (List.tail (List.tail [1; 2; 3])) ;; ???
  • 49. リスト List の定義 – [] – x :: List > List.head [1; 2; 3] ;; val it : int = 1 > List.tail [1; 2; 3] ;; val it : int list = [2; 3] > List.head (List.tail (List.tail [1; 2; 3])) ;; val it : int = 3
  • 50. Listモジュール append fold iteri2 ofArray sortBy average fold2 length ofSeq sortWith averageBy foldBack map partition sum choose foldBack2 map2 permute sumBy collect forall map3 pick tail concat forall2 mapi reduce toArray empty head mapi2 reduceBack toSeq exists init max replicate tryFind exists2 isEmpty maxBy rev tryFindIndex filter iter min scan tryPick find iter2 minBy scanBack unzip unzip3 findIndex iteri nth sort zip zip3
  • 51. List.map : ('a -> 'b) -> 'a list -> 'b list すべての要素に関数を適用 > let add1 x = x + 1 ;; val add1 : int -> int > List.map add1 [9; 99; 999] ;; val it : int list = [10; 100; 1000] > List.map (fun x -> x + 1) [1; 2; 3] ;; val it : int list = [2; 3; 4]
  • 52. List.map : ('a -> 'b) -> 'a list -> 'b list すべての要素に関数を適用 > ( + ) ;; val it : (int -> int -> int) = <fun:it@25-4> > ( + ) 1 1 ;; val it : int = 2 > List.map (( + ) 1) [1; 2; 3] ;; // 部分適用 val it : int list = [2; 3; 4]
  • 53. List.filter : ('a -> bool) -> 'a list -> 'a list 関数の適用結果が真の要素だけ抽出 > let even x = x % 2 = 0 ;; val even : int -> bool > List.filter even [1; 2; 3; 4; 5; 6; 7; 8] ;; val it : int list = [2; 4; 6; 8] > List.filter (( < ) 4) [1; 5; 6; 2; 3; 7] ;; val it : int list = [5; 6; 7]
  • 54. 定義してみると・・・ let rec MyMap f list' = match list' with | [] -> [] | x :: rest -> f x :: MyMap f rest let rec MyFilter f = function | [] -> [] | x :: rest when f x -> x :: MyFilter f rest | _ :: rest -> MyFilter f rest これは何だ・・・(?_?)
  • 56. パターソマッチ let MyMatch1 tuple = match tuple with | (0, 0) -> "zero" | (x, y) when x > y -> ">" | (x, y) when x < y -> "<" | _ -> "=" > MyMatch1 (3, 5) ;; val it : string = "<" > MyMatch1 (2, 2) ;; val it : string = "="
  • 57. もしパターンマッチがなかったら... let MyMatch1' tuple = if fst tuple = 0 && snd tuple = 0 then "zero" elif fst tuple > snd tuple then ">" elif fst tuple < snd tuple then "<" else "="
  • 58. パターンマッ千 let MyMatch2 list' = match list' with | [] -> 0 | [x] -> x | [x; y] -> x - y | _ -> failwith "エラー!" > MyMatch2 [13; 3] ;; val it : int = 10 > MyMatch2 [1; 2; 3] ;; System.Exception: エラー!
  • 59. 八゚ターンマッチ let rec MyMatch3 list' = match list' with | [] -> 0 | x :: rest -> x + MyMatch3 rest > [1 .. 5] ;; val it : int list = [1; 2; 3; 4; 5] > MyMatch3 [1 .. 3] ;; ???
  • 60. 八゚ターンマッチ let rec MyMatch3 list' = match list' with | [] -> 0 | x :: rest -> x + MyMatch3 rest > [1 .. 5] ;; val it : int list = [1; 2; 3; 4; 5] > MyMatch3 [1 .. 3] ;; val it : int = 6
  • 61. パ夕ーンマッチ type Color = | Red | Green | Blue | White let MyMatch4 color = match color with | Red -> "あか" | Green -> "みどり" | _ -> "そのた"
  • 62. pat := const -- constant pattern long-ident pat-paramopt patopt -- named pattern _ -- wildcard pattern pat as ident -- "as" pattern pat '|' pat -- "or" pattern pat '&' pat -- "and" pattern pat :: pat -- "cons" pattern pat : type -- pattern with type constraint pat,...,pat -- tuple pattern (pat) -- parenthesized pattern list-pat -- list pattern array-pat -- array pattern record-pat -- record pattern :? atomic-type -- dynamic type test pattern :? atomic-type as ident -- dynamic type test pattern null -- null-test pattern attributes pat -- pattern with attributes
  • 65. [<AbstractClass>] type BaseClass() = abstract Method1 : int -> int type IBase = abstract Method2 : int -> int type SubClass() = inherit BaseClass() override self.Method1 x = x + 10 interface IBase with member self.Method2 x = x * 10
  • 67. [<Measure>] type h [<Measure>] type km [<Measure>] type cm [<Measure>] type cm2 = cm ^ 2 > 155<km/h> ;; val it : int<km/h> = 155 > 5<cm> * 8<cm> ;; val it : int<cm ^ 2> = 40 > let a : int<cm2> = 2<cm> * 10<cm> ;; val a : int<cm2> = 20 > 1<h> + 2<cm> ;; error: The unit of measure 'cm' does not match the unit of measure 'h'
  • 69. let (|S|A|B|C|) score = if score >= 80 then S elif score >= 60 then A elif score >= 40 then B else C let GiveGrade score = match score with | S -> "たいへんよい" | A -> "よい" | B -> "がんばろう" | C -> "ゆとり"
  • 71. 式を <@ ~ @> で囲うと、式木を得られる Microsoft.FSharp.Quotations > <@ let f x = x + 10 in f 90 @> ;; val it : Expr<int> = Let (f, Lambda (x, Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [x, Value (10)])), Application (f, Value (90))) {CustomAttributes = [NewTuple (Value ("DebugRange"), NewTuple (Value ("stdin"), Value (5), Value (7), Value (5), Value (10)))]; Raw = ...; Type = System.Int32;}
  • 72. Microsoft.FSharp.Quotations.Patterns let MyFun = function | Var v -> "変数だよー : " + v.Name | Value (o, _) -> "定数値だよー : " + o.ToString () | NewTuple _ -> "タプルだよー" | Call _ -> "関数呼び出しだよー" | Lambda _ -> "λ式だよー" | _ -> "その他" > MyFun <@ 100 @> ;; val it : string = "定数値だよー : 100" > MyFun <@ 1 + 1 @> ;; val it : string = "関数呼び出しだよー" > MyFun <@ fun x -> x @> ;; val it : string = "λ式だよー"
  • 74. PLINQ(PSeq) - Demo -
  • 77. F# User Group - Japan • http://groups.google.co.jp/group/fsug-jp ( http://bit.ly/fsug-jp ) • 国内最大級のF#オンラインコミュニティ!! • お気軽にご参加ください • Twitter : #fsugjp

Notas del editor

  1. 最後にトレースする。 f=f1, x=50, y=80 -&gt; f1 (50, 80)