SlideShare a Scribd company logo
1 of 40
Download to read offline
磯野ー!
関数型言語やろうぜー!

          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

More Related Content

What's hot

大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法
Takuya Akiba
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
Kota Mizushima
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
 

What's hot (20)

関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した
 

Viewers also liked

ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
Kousuke Ruichi
 
『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践
Kazuo Kashima
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
Yoichi Toyota
 
関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた
Takashi Nishisaki
 

Viewers also liked (20)

たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)
 
技術者が知るべき 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)
 
関数型軽い紹介
関数型軽い紹介関数型軽い紹介
関数型軽い紹介
 
関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた
 

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

Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションサイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
sn_monochr
 
ラボユース 最終成果報告会
ラボユース 最終成果報告会ラボユース 最終成果報告会
ラボユース 最終成果報告会
shiftky
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
 

Similar to 磯野ー!関数型言語やろうぜー! (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回勉強会スライド
 

Recently uploaded

Recently uploaded (12)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

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

  • 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