SlideShare a Scribd company logo
磯野ー!
関数型言語やろうぜー!

          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

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
Michihito Shigemura
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
圏とHaskellの型
圏とHaskellの型圏とHaskellの型
圏とHaskellの型
KinebuchiTomo
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
Mikiya Okuno
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼう
xenophobia__
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 

What's hot (20)

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
圏とHaskellの型
圏とHaskellの型圏とHaskellの型
圏とHaskellの型
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼう
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 

Viewers also liked

数学プログラムを 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
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
 
GLT#13 Naruhiko Ogasawara
GLT#13 Naruhiko OgasawaraGLT#13 Naruhiko Ogasawara
GLT#13 Naruhiko Ogasawara
Naruhiko Ogasawara
 
プログラミングの基礎振り返りスライド1
プログラミングの基礎振り返りスライド1プログラミングの基礎振り返りスライド1
プログラミングの基礎振り返りスライド1
sunotora
 
Fftw誰得ガイド
Fftw誰得ガイドFftw誰得ガイド
Fftw誰得ガイド
chunjp
 
パワポアート・オンライン
パワポアート・オンラインパワポアート・オンライン
パワポアート・オンライン
高見 知英
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話Kousuke Ruichi
 
『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践『伝達したい情報を構造化し表現する技術』教育の実践
『伝達したい情報を構造化し表現する技術』教育の実践Kazuo Kashima
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
Shinichi Kozake
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみたYoichi Toyota
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについて
Mitsutoshi Aoe
 
第2部 自作ライブラリ紹介
第2部  自作ライブラリ紹介第2部  自作ライブラリ紹介
Rust言語紹介
Rust言語紹介Rust言語紹介
Rust言語紹介
Paweł Rusin
 

Viewers also liked (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)
 

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

関数型言語&形式的手法セミナー(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 - StreamAPI
bitter_fox
 
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
 
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
Youhei 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回 ‟変数と型„
和弘 井之上
 
ラボユース 最終成果報告会
ラボユース 最終成果報告会ラボユース 最終成果報告会
ラボユース 最終成果報告会shiftky
 
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションサイボウズ・ラボユース 最終成果報告会プレゼンテーション
サイボウズ・ラボユース 最終成果報告会プレゼンテーションsn_monochr
 
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;
 

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

This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 

Recently uploaded (8)

This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 

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

  • 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