SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
磯野ー!
関数型言語やろうぜー!

          1/40
中の人
@razon      ●   角田裕樹
id:razon    ●   天領倉敷Scala
                言いだしっぺ
            ●   岡山Javaユーザ会
                戦闘員A
            ●   TDDBC岡山
                戦闘員D(くらい)
            ●   ハッシュタグレイパー
            ●   普段はJavaとか
            ●   Excel方眼紙爆発しろ
                               2/40
はじめに




このセッションは、関数型国家名古屋の影響を
それなりに受けています。そのため、
「関数型言語=静的型付けの関数型言語」と
なっておりますが、あらかじめご了承ください。
                    3/40
おしながき


●   関数型言語とは?

●   どんな言語があるの?

●   関数型言語のエッセンス
                  4/40
関数型言語とは?


           5/40
関数型言語とは?
●   関数がファーストオブジェクト




                     6/40
関数型言語とは?
●   関数がファーストオブジェクト
    ●   関数を変数に代入できる
    ●   関数の引数に関数型を指定できる
    ●   関数の戻り値に関数型を指定できる




                           7/40
どんな言語があるの?


             8/40
OCaml
●   Objective Caml
●   ML系
●   中の人の関係で名古屋に使い手が多い




                             9/40
F#
●   OCamlの影響を強く受ける
●   .Net Framework上で動作
●   実はOSS
    (Apache 2.0ライセンス)




                         10/40
Haskell
●   純粋関数型言語
    ●   遅延評価
    ●   状態を持たない(変数への再代入ができない)




                                11/40
Scala
●   JVM上で動作(.Net向け実装も開発中)
●   オブジェクト指向と関数型のハイブリッド




                            12/40
関数型言語のエッセンス


          13/40
文から式へ
●   手続き型言語
    ●   命令文を順に実行していく
●   関数型言語
    ●   式を組み合わせて処理を行う




                        14/40
文から式へ
●   ifやforも文ではなく式(値を返す)
●   入力値から出力値へ、関数(式)を繋げて
    値を変換する




                          15/40
文から式へ




        16/40
副作用
●   とある機能で、実行時に戻り値以外の何かしら
    の値を変更すること
    ●   いわゆる破壊的操作
    ●   I/O




                       17/40
副作用
●   とある機能で、実行時に戻り値以外の何かしら
    の値を変更すること
    ●   いわゆる破壊的操作
    ●   I/O


        class   Clazz {
          var   n = 0
          def   inc { n += 1 }                // 副作用がある
          def   sum(a: Int, b: Int) = a + b   // 副作用がない
        }


                                                          18/40
副作用
●   関数型言語では、原則として副作用が存在しな
    いものとみなす
    ●   ※非純粋関数型言語では破壊的操作を行えるが、
        極力行わないようにする




                             19/40
副作用
●   副作用がない=同じ引数の場合は必ず同じ結果
    となる(参照透過性)
    ●   テストが容易になる
    ●   並列処理に向いている




                       20/40
再帰によるループ処理
●   forやwhileによるループには副作用がある
    →カウンタ変数や、計算結果を格納する変数
     var count = 0
     var result = 0
     while (i < 10) {
       result += i
       i += 1
     }




                          21/40
再帰によるループ処理
●   forやwhileによるループには副作用がある
    →カウンタ変数や、計算結果を格納する変数
     var count = 0
     var result = 0
     while (i < 10) {
       result += i
       i += 1
     }

●   再帰によるループで副作用を取り除く
     def sum(i: Int): Int =
       if (i <= 0) i else i + sum(i - 1)


                                           22/40
再帰によるループ処理
●   再帰の階層が深くなるとスタックオーバーフ
    ローが発生する
●   末尾再帰に書き直すことで、最適化が行われて
    スタックオーバーフローが発生しなくなる
●   末尾再帰:関数の一番最後で自分自身を再帰呼
    び出しする関数
     def sum(i: Int): Int = {
       def s(i: Int, acc: Int) =
         if (i <= 0) i else i + s(i – 1, acc + i)
       s(i, 0)
     }

                                                    23/40
型安全
val year = 2011
val month = 10
year + month




                        24/40
型安全
     val year = 2011
     val month = 10
     year + month

●   コンパイラはエラーを出さないが、
    正しい処理をしているか?




                             25/40
型安全
case class   Year(year: Int) {
  def +(v:   Year) = Year(year + v.year)
}
case class   Month(month: Int) {
  def +(v:   Month) = Month(month + v.month)
}

scala> Year(1) + Month(2)
<console>:12: error: type mismatch;
 found   : Month
 required: Year
              Year(1) + Month(2)
                             ^

scala> Year(1) + Year(2)
res11: Year = Year(3)

                                               26/40
One more thing...
                    27/40
関数型言語の深淵へ


            28/40
モナド
●   計算機科学におけるモナドとは、Eugenio
    Moggiによって提案されたモジュール性を持た
    せた表示的意味論の枠組みを言う。プログラム
    とはクライスリ射である、という要請からクラ
    イスリトリプル(Kleisli triple)というモナド
    と同値な関係にあるものが実際上は使われる。
    プログラミング言語のHaskellで用いられるも
    のがよく知られている。
●   モナドの名称は、圏論のモナド(モノイド+ト
    ライアド)に基づいており、ライプニッツのモ
    ナド(単子論)とは無関係である。
                               29/40
モナド




      30/40
モナド
●   誤解を恐れずに言うならば一種のイディオム
    (デザインパターン)
●   入力値から出力値へ、式を組み合わせて処理を
    行っていく際に、式と式を繋げるための統一さ
    れた仕組み




                       31/40
モナド
●   「モナド則」というものを満たしている型同士
    は容易に式を繋ぐことができる
●   (かなり話は飛んで)モナドをよしなにして、
    参照透過性と保ちつつ状態を持ったり、入出力
    を取り扱ったりできる




                       32/40
One more thing...
                    33/40
関数型国家
 名古屋

        34/40
関数型国家名古屋
●   某名古屋の方の証言




                   35/40
関数型国家名古屋




           36/40
関数型国家名古屋




           37/40
関数型国家名古屋




           38/40
まとめ
●   魔法少女Scalaちゃんハァハァ

●   名古屋は多分こわくない

●   Excel方眼紙爆発しろ!

                       39/40
まとめ


  磯野ー!
 関数型言語
やろうぜー!

         40/40

Weitere ähnliche Inhalte

Was ist angesagt?

Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさcct-inc
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた
Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみたRust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた
Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた虎の穴 開発室
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたKohei Nakamura
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用nagise
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方Yoshitaka Kawashima
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
 

Was ist angesagt? (20)

Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさ
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた
Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみたRust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた
Rust製の全文検索エンジンライブラリ(tantivy bayard)を試してみた
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 

Andere mochten auch

数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由Hiromi Ishii
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)tadaaki hayashi
 
技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底Hiromi Ishii
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門yujiro_t
 
関数型プログラミングとモナド
関数型プログラミングとモナド関数型プログラミングとモナド
関数型プログラミングとモナドMasayuki Isobe
 
プログラミングの基礎振り返りスライド1
プログラミングの基礎振り返りスライド1プログラミングの基礎振り返りスライド1
プログラミングの基礎振り返りスライド1sunotora
 
Fftw誰得ガイド
Fftw誰得ガイドFftw誰得ガイド
Fftw誰得ガイドchunjp
 
パワポアート・オンライン
パワポアート・オンラインパワポアート・オンライン
パワポアート・オンライン高見 知英
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話Kousuke Ruichi
 
『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践Kazuo Kashima
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみたYoichi Toyota
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてMitsutoshi Aoe
 
関数型軽い紹介
関数型軽い紹介関数型軽い紹介
関数型軽い紹介Daniel Perez
 

Andere mochten auch (20)

数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)
 
技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 
関数型プログラミングとモナド
関数型プログラミングとモナド関数型プログラミングとモナド
関数型プログラミングとモナド
 
GLT#13 Naruhiko Ogasawara
GLT#13 Naruhiko OgasawaraGLT#13 Naruhiko Ogasawara
GLT#13 Naruhiko Ogasawara
 
プログラミングの基礎振り返りスライド1
プログラミングの基礎振り返りスライド1プログラミングの基礎振り返りスライド1
プログラミングの基礎振り返りスライド1
 
Fftw誰得ガイド
Fftw誰得ガイドFftw誰得ガイド
Fftw誰得ガイド
 
パワポアート・オンライン
パワポアート・オンラインパワポアート・オンライン
パワポアート・オンライン
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
 
『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
Erlang
ErlangErlang
Erlang
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについて
 
第2部 自作ライブラリ紹介
第2部  自作ライブラリ紹介第2部  自作ライブラリ紹介
第2部 自作ライブラリ紹介
 
Rust言語紹介
Rust言語紹介Rust言語紹介
Rust言語紹介
 
Yesod(at FPM2012)
Yesod(at FPM2012)Yesod(at FPM2012)
Yesod(at FPM2012)
 
関数型軽い紹介
関数型軽い紹介関数型軽い紹介
関数型軽い紹介
 

Ähnlich wie 磯野ー!関数型言語やろうぜー!

関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門masatora atarashi
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Brand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIBrand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIbitter_fox
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
The Why and How of Java8 at LINE Fukuoka
The Why and How of Java8 at LINE FukuokaThe Why and How of Java8 at LINE Fukuoka
The Why and How of Java8 at LINE FukuokaYouhei Nitta
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„和弘 井之上
 
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションサイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションsn_monochr
 
ラボユース 最終成果報告会
ラボユース 最終成果報告会ラボユース 最終成果報告会
ラボユース 最終成果報告会shiftky
 
TypeScript & 関数型講座 第3回 関数型入門
TypeScript & 関数型講座 第3回 関数型入門TypeScript & 関数型講座 第3回 関数型入門
TypeScript & 関数型講座 第3回 関数型入門gypsygypsy
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章Last Arrow
 
第一回ゆるふわーる
第一回ゆるふわーる第一回ゆるふわーる
第一回ゆるふわーるSachiko Hirata
 
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトobjc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトTaketo Sano
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„和弘 井之上
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライドkoturn 0;
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 

Ähnlich wie 磯野ー!関数型言語やろうぜー! (20)

関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Brand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIBrand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPI
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
The Why and How of Java8 at LINE Fukuoka
The Why and How of Java8 at LINE FukuokaThe Why and How of Java8 at LINE Fukuoka
The Why and How of Java8 at LINE Fukuoka
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
 
Clojure
ClojureClojure
Clojure
 
Hokuriku Scala 1
Hokuriku Scala 1Hokuriku Scala 1
Hokuriku Scala 1
 
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションサイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
 
ラボユース 最終成果報告会
ラボユース 最終成果報告会ラボユース 最終成果報告会
ラボユース 最終成果報告会
 
TypeScript & 関数型講座 第3回 関数型入門
TypeScript & 関数型講座 第3回 関数型入門TypeScript & 関数型講座 第3回 関数型入門
TypeScript & 関数型講座 第3回 関数型入門
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 4 章
 
第一回ゆるふわーる
第一回ゆるふわーる第一回ゆるふわーる
第一回ゆるふわーる
 
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトobjc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 

磯野ー!関数型言語やろうぜー!

  • 2. 中の人 @razon ● 角田裕樹 id:razon ● 天領倉敷Scala 言いだしっぺ ● 岡山Javaユーザ会 戦闘員A ● TDDBC岡山 戦闘員D(くらい) ● ハッシュタグレイパー ● 普段はJavaとか ● Excel方眼紙爆発しろ 2/40
  • 4. おしながき ● 関数型言語とは? ● どんな言語があるの? ● 関数型言語のエッセンス 4/40
  • 6. 関数型言語とは? ● 関数がファーストオブジェクト 6/40
  • 7. 関数型言語とは? ● 関数がファーストオブジェクト ● 関数を変数に代入できる ● 関数の引数に関数型を指定できる ● 関数の戻り値に関数型を指定できる 7/40
  • 9. OCaml ● Objective Caml ● ML系 ● 中の人の関係で名古屋に使い手が多い 9/40
  • 10. F# ● OCamlの影響を強く受ける ● .Net Framework上で動作 ● 実はOSS (Apache 2.0ライセンス) 10/40
  • 11. Haskell ● 純粋関数型言語 ● 遅延評価 ● 状態を持たない(変数への再代入ができない) 11/40
  • 12. Scala ● JVM上で動作(.Net向け実装も開発中) ● オブジェクト指向と関数型のハイブリッド 12/40
  • 14. 文から式へ ● 手続き型言語 ● 命令文を順に実行していく ● 関数型言語 ● 式を組み合わせて処理を行う 14/40
  • 15. 文から式へ ● ifやforも文ではなく式(値を返す) ● 入力値から出力値へ、関数(式)を繋げて 値を変換する 15/40
  • 17. 副作用 ● とある機能で、実行時に戻り値以外の何かしら の値を変更すること ● いわゆる破壊的操作 ● I/O 17/40
  • 18. 副作用 ● とある機能で、実行時に戻り値以外の何かしら の値を変更すること ● いわゆる破壊的操作 ● I/O class Clazz { var n = 0 def inc { n += 1 } // 副作用がある def sum(a: Int, b: Int) = a + b // 副作用がない } 18/40
  • 19. 副作用 ● 関数型言語では、原則として副作用が存在しな いものとみなす ● ※非純粋関数型言語では破壊的操作を行えるが、 極力行わないようにする 19/40
  • 20. 副作用 ● 副作用がない=同じ引数の場合は必ず同じ結果 となる(参照透過性) ● テストが容易になる ● 並列処理に向いている 20/40
  • 21. 再帰によるループ処理 ● forやwhileによるループには副作用がある →カウンタ変数や、計算結果を格納する変数 var count = 0 var result = 0 while (i < 10) { result += i i += 1 } 21/40
  • 22. 再帰によるループ処理 ● forやwhileによるループには副作用がある →カウンタ変数や、計算結果を格納する変数 var count = 0 var result = 0 while (i < 10) { result += i i += 1 } ● 再帰によるループで副作用を取り除く def sum(i: Int): Int = if (i <= 0) i else i + sum(i - 1) 22/40
  • 23. 再帰によるループ処理 ● 再帰の階層が深くなるとスタックオーバーフ ローが発生する ● 末尾再帰に書き直すことで、最適化が行われて スタックオーバーフローが発生しなくなる ● 末尾再帰:関数の一番最後で自分自身を再帰呼 び出しする関数 def sum(i: Int): Int = { def s(i: Int, acc: Int) = if (i <= 0) i else i + s(i – 1, acc + i) s(i, 0) } 23/40
  • 24. 型安全 val year = 2011 val month = 10 year + month 24/40
  • 25. 型安全 val year = 2011 val month = 10 year + month ● コンパイラはエラーを出さないが、 正しい処理をしているか? 25/40
  • 26. 型安全 case class Year(year: Int) { def +(v: Year) = Year(year + v.year) } case class Month(month: Int) { def +(v: Month) = Month(month + v.month) } scala> Year(1) + Month(2) <console>:12: error: type mismatch; found : Month required: Year Year(1) + Month(2) ^ scala> Year(1) + Year(2) res11: Year = Year(3) 26/40
  • 29. モナド ● 計算機科学におけるモナドとは、Eugenio Moggiによって提案されたモジュール性を持た せた表示的意味論の枠組みを言う。プログラム とはクライスリ射である、という要請からクラ イスリトリプル(Kleisli triple)というモナド と同値な関係にあるものが実際上は使われる。 プログラミング言語のHaskellで用いられるも のがよく知られている。 ● モナドの名称は、圏論のモナド(モノイド+ト ライアド)に基づいており、ライプニッツのモ ナド(単子論)とは無関係である。 29/40
  • 30. モナド 30/40
  • 31. モナド ● 誤解を恐れずに言うならば一種のイディオム (デザインパターン) ● 入力値から出力値へ、式を組み合わせて処理を 行っていく際に、式と式を繋げるための統一さ れた仕組み 31/40
  • 32. モナド ● 「モナド則」というものを満たしている型同士 は容易に式を繋ぐことができる ● (かなり話は飛んで)モナドをよしなにして、 参照透過性と保ちつつ状態を持ったり、入出力 を取り扱ったりできる 32/40
  • 35. 関数型国家名古屋 ● 某名古屋の方の証言 35/40
  • 39. まとめ ● 魔法少女Scalaちゃんハァハァ ● 名古屋は多分こわくない ● Excel方眼紙爆発しろ! 39/40
  • 40. まとめ 磯野ー! 関数型言語 やろうぜー! 40/40