Suche senden
Hochladen
Functional Way
•
0 gefällt mir
•
492 views
Kent Ohashi
Folgen
フィボナッチ数の計算を例に関数型プログラミングの基本的な概念を紹介。 関数型プログラミングを始めよう!
Weniger lesen
Mehr lesen
Software
Melden
Teilen
Melden
Teilen
1 von 18
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Recomendados
おいしいLisp
おいしいLisp
Kent Ohashi
From Java To Clojure
From Java To Clojure
Kent Ohashi
From JS To CLJS
From JS To CLJS
Kent Ohashi
C++14 Overview
C++14 Overview
Akira Takahashi
大人のお型付け
大人のお型付け
Nobuhisa Koizumi
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
More C++11
More C++11
京大 マイコンクラブ
C++ lecture-2
C++ lecture-2
sunaemon
Más contenido relacionado
Was ist angesagt?
並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
Introduction to cython
Introduction to cython
Atsuo Ishimoto
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
C++11
C++11
京大 マイコンクラブ
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
Yuichi Sakuraba
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
dcomsolution
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
言語処理系入門4
言語処理系入門4
Kenta Hattori
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
C++ lecture-0
C++ lecture-0
sunaemon
Scalamacrosについて
Scalamacrosについて
dekosuke
F#によるFunctional Programming入門
F#によるFunctional Programming入門
bleis tift
言語処理系入門5
言語処理系入門5
Kenta Hattori
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
60分で体験する Stream / Lambda ハンズオン
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
Was ist angesagt?
(20)
並行プログラミングと継続モナド
並行プログラミングと継続モナド
Introduction to cython
Introduction to cython
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
C++11
C++11
Visual C++で使えるC++11
Visual C++で使えるC++11
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
言語処理系入門4
言語処理系入門4
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
JavaScript 講習会 #1
JavaScript 講習会 #1
C++ lecture-0
C++ lecture-0
Scalamacrosについて
Scalamacrosについて
F#によるFunctional Programming入門
F#によるFunctional Programming入門
言語処理系入門5
言語処理系入門5
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
60分で体験する Stream / Lambda ハンズオン
60分で体験する Stream / Lambda ハンズオン
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
Andere mochten auch
MP in Haskell
MP in Haskell
Kent Ohashi
From Java To Clojure (English version)
From Java To Clojure (English version)
Kent Ohashi
MP in Scala
MP in Scala
Kent Ohashi
Clojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しよう
Keisuke Fukuda
Rプログラミング01 はじめの一歩
Rプログラミング01 はじめの一歩
wada, kazumi
Rデモ01_はじめの一歩2016
Rデモ01_はじめの一歩2016
wada, kazumi
ロジカル・シンキング & システム設計・プログラミングについて
ロジカル・シンキング & システム設計・プログラミングについて
Dai Saito
Rデモ02_入出力編2016
Rデモ02_入出力編2016
wada, kazumi
Rデモ03_データ分析編2016
Rデモ03_データ分析編2016
wada, kazumi
Rプログラミング02 データ入出力編
Rプログラミング02 データ入出力編
wada, kazumi
HTTP/2 in nginx(2016/3/11 社内勉強会)
HTTP/2 in nginx(2016/3/11 社内勉強会)
Yoko TAMADA
Rプログラミング03 データ分析編
Rプログラミング03 データ分析編
wada, kazumi
ネットワーク概論 サーバの構築理論
ネットワーク概論 サーバの構築理論
Takahiro Komatsu
Practical Phonetics (実践音声学)
Practical Phonetics (実践音声学)
Kent Ohashi
Andere mochten auch
(14)
MP in Haskell
MP in Haskell
From Java To Clojure (English version)
From Java To Clojure (English version)
MP in Scala
MP in Scala
Clojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しよう
Rプログラミング01 はじめの一歩
Rプログラミング01 はじめの一歩
Rデモ01_はじめの一歩2016
Rデモ01_はじめの一歩2016
ロジカル・シンキング & システム設計・プログラミングについて
ロジカル・シンキング & システム設計・プログラミングについて
Rデモ02_入出力編2016
Rデモ02_入出力編2016
Rデモ03_データ分析編2016
Rデモ03_データ分析編2016
Rプログラミング02 データ入出力編
Rプログラミング02 データ入出力編
HTTP/2 in nginx(2016/3/11 社内勉強会)
HTTP/2 in nginx(2016/3/11 社内勉強会)
Rプログラミング03 データ分析編
Rプログラミング03 データ分析編
ネットワーク概論 サーバの構築理論
ネットワーク概論 サーバの構築理論
Practical Phonetics (実践音声学)
Practical Phonetics (実践音声学)
Ähnlich wie Functional Way
ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門
Computational Materials Science Initiative
たのしい関数型
たのしい関数型
Shinichi Kozake
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
fukuoka.ex
言語処理系入門10
言語処理系入門10
Kenta Hattori
Control.Arrow
Control.Arrow
haru haru
Everyday Life with clojure.spec
Everyday Life with clojure.spec
Kent Ohashi
研究生のためのC++ no.2
研究生のためのC++ no.2
Tomohiro Namba
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
Rの高速化
Rの高速化
弘毅 露崎
たのしい高階関数
たのしい高階関数
Shinichi Kozake
Subprocess no susume
Subprocess no susume
Makoto Kishimoto
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI
po-3. 式の抽象化と関数
po-3. 式の抽象化と関数
kunihikokaneko1
あらためてPHP5.3
あらためてPHP5.3
Masashi Shinbara
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
Haxeについて
Haxeについて
Moriyoshi Koizumi
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
理 小林
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
yashigani
Ähnlich wie Functional Way
(20)
ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門
たのしい関数型
たのしい関数型
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
言語処理系入門10
言語処理系入門10
Control.Arrow
Control.Arrow
Everyday Life with clojure.spec
Everyday Life with clojure.spec
研究生のためのC++ no.2
研究生のためのC++ no.2
関数プログラミング入門
関数プログラミング入門
Rの高速化
Rの高速化
たのしい高階関数
たのしい高階関数
Subprocess no susume
Subprocess no susume
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
po-3. 式の抽象化と関数
po-3. 式の抽象化と関数
あらためてPHP5.3
あらためてPHP5.3
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Haxeについて
Haxeについて
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
Mehr von Kent Ohashi
Team Geek Revisited
Team Geek Revisited
Kent Ohashi
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Kent Ohashi
Clojureコレクションで探るimmutableでpersistentな世界
Clojureコレクションで探るimmutableでpersistentな世界
Kent Ohashi
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
Kent Ohashi
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
Kent Ohashi
実用のための語源学入門
実用のための語源学入門
Kent Ohashi
メタプログラミング入門
メタプログラミング入門
Kent Ohashi
労働法の世界
労働法の世界
Kent Ohashi
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSL
Kent Ohashi
RDBでのツリー表現入門
RDBでのツリー表現入門
Kent Ohashi
GraphQL入門
GraphQL入門
Kent Ohashi
たのしい多言語学習
たのしい多言語学習
Kent Ohashi
Ductモジュール入門
Ductモジュール入門
Kent Ohashi
Clojure REPL: The Good Parts
Clojure REPL: The Good Parts
Kent Ohashi
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Kent Ohashi
Clojurian Conquest
Clojurian Conquest
Kent Ohashi
ClojurianからみたElixir
ClojurianからみたElixir
Kent Ohashi
GraphQL API in Clojure
GraphQL API in Clojure
Kent Ohashi
法学入門
法学入門
Kent Ohashi
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of Pedestal
Kent Ohashi
Mehr von Kent Ohashi
(20)
Team Geek Revisited
Team Geek Revisited
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Clojureコレクションで探るimmutableでpersistentな世界
Clojureコレクションで探るimmutableでpersistentな世界
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
実用のための語源学入門
実用のための語源学入門
メタプログラミング入門
メタプログラミング入門
労働法の世界
労働法の世界
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSL
RDBでのツリー表現入門
RDBでのツリー表現入門
GraphQL入門
GraphQL入門
たのしい多言語学習
たのしい多言語学習
Ductモジュール入門
Ductモジュール入門
Clojure REPL: The Good Parts
Clojure REPL: The Good Parts
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Clojurian Conquest
Clojurian Conquest
ClojurianからみたElixir
ClojurianからみたElixir
GraphQL API in Clojure
GraphQL API in Clojure
法学入門
法学入門
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of Pedestal
Functional Way
1.
Functional Way
2.
自己紹介: lagénorhynque
3.
(defprofile lagénorhynque [Kent
OHASHI] :github/twitter @lagenorhynque :company 株式会社オプト :languages [Clojure Haskell Python Scala Go English français Deutsch русский] :interests [プログラミング 語学 数学])
4.
「フィボナッチ数」( )の計算を例にFibonacci number 関数型プログラミングの基本的な概念を紹介 1. 再帰(recursion) 2.
末尾再帰(tail recursion) 3. 高階関数(higher-order function) 4. 遅延評価(lazy evaluation)
5.
フィボナッチ数 番目のフィボナッチ数 は、以下のように定義される。i Fi F0 F1 Fi = = = 0 1 +
, i ≥ 2Fi−2 Fi−1 と続き、0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . . 直前の2項の和が次の項になっている。
6.
0. ループ 手続き型( )言語の基本パターンprocedural # Python def
fibonacci(i): a, b = 0, 1 for n in range(i): a, b = b, a + b return a 副作用( ) 命令型( ) side e ect imperative
7.
変数やループ構造が目立ち、数学的な定義(プログラムの仕様)との関 係が分かりづらい 登場する変数が多くなったり、処理が複雑になったりすると、状態の 変化をたどるのが困難になりうる
8.
1. 再帰 ( )recursion 関数型( )言語の基本パターンfunctional --
Haskell fibonacci1 :: Int -> Integer fibonacci1 0 = 0 fibonacci1 1 = 1 fibonacci1 i = fibonacci1 (i - 2) + fibonacci1 (i - 1) ;; Clojure (defn fibonacci1 [i] (cond (= i 0) 0N (= i 1) 1N :else (+ (fibonacci1 (- i 2)) (fibonacci1 (- i 1))))) パターンマッチング( ) 宣言型( ) 参照透過性( ) pattern matching declarative referential transparency
9.
数学的な再帰的定義をほぼそのまま表現した、シンプルなコード 可変状態がないため状態の変化を管理する必要がなくなり、並列/並 行処理として実行するのも比較的容易 関数呼出しの繰り返しによりスタックオーバーフローが発生する可能 性がある フィボナッチ数の場合、同一の計算が繰り返されて計算量が指数的に 増大してしまう→メモ化( )を検討memoization
10.
2. 末尾再帰 ( )tail recursion 関数内部で最後に実行される処理が再帰呼出しになっている再帰 -- Haskell fibonacci2
:: Int -> Integer fibonacci2 i = fib i 0 1 where fib 0 a _ = a fib n a b = fib (n - 1) b (a + b) ;; Clojure (defn fibonacci2 [i] (letfn [(fib [n a b] (if (zero? n) a (recur (dec n) b (+ a b))))] (fib i 0N 1N)))
11.
多くの関数型言語では末尾再帰関数が末尾呼出し最適化(tail call optimization)により命令型のループと同等の処理に変換され、スタ ックオーバーフローが防止できる コードの処理内容も命令型ループによく似ている
12.
3. 高階関数 ( )higher-order function 引数として関数を受け取る、または戻り値として関数を返す関数 -- Haskell fibonacci3
:: Int -> Integer fibonacci3 i = fst $ foldl' fib (0, 1) [1..i] where fib (a, b) _ = (b, a + b) ;; Clojure (defn fibonacci3 [i] (letfn [(fib [[a b] _] [b (+ a b)])] (first (reduce fib [0N 1N] (range 0 i)))))
13.
典型的な繰り返し処理は抽象化されたライブラリの高階関数に任せ、 固有のロジックを持った関数の実装に集中することで、効率良くコー ディングすることができ、コードの可読性も向上する オブジェクト指向プログラミングのデザインパターンの多くは高階関 数によって同等の目的を果たせる
14.
4. 遅延評価 ( )lazy evaluation 式の評価を計算で必要になるまで遅らせる評価戦略 cf. 先行評価(
)eager evaluation -- Haskell fibonacci4 :: Int -> Integer fibonacci4 i = fibs !! i where fibs = map fst $ iterate ((a, b) -> (b, a + b)) (0, 1) ;; Clojure (defn fibonacci4 [i] (let [fibs (map first (iterate (fn [[a b]] [b (+ a b)]) [0N 1N]))] (nth fibs i)))
15.
-- Haskell fibonacci5 ::
Int -> Integer fibonacci5 i = fibs !! i where fibs = 0 : 1 : zipWith (+) fibs (tail fibs) ;; Clojure (defn fibonacci5 [i] (letfn [(fibs [a b] (cons a (lazy-seq (fibs b (+ a b)))))] (nth (fibs 0N 1N) i)))
16.
Haskellでは遅延評価がデフォルトの評価戦略 Clojureは先行評価が基本だが、遅延評価されるシーケンス(遅延シー ケンス)が利用できる 特に巨大なデータ構造や無限に続くデータ構造を扱う場合に、シンプ ルな定義と効率を両立させることができる
17.
Further Reading Haskell 『プログラミングHaskell』 『すごいHaskellたのしく学ぼう!』 『関数プログラミング実践入門』 Clojure 『プログラミングClojure』 Exploring Clojure with
Factorial Computation Scala 『Scalaスケーラブルプログラミング』 『Scala関数型デザイン&プログラミング』
18.
Erlang 『すごいErlangゆかいに学ぼう!』 Elixir 『プログラミングElixir』 OCaml 『プログラミングの基礎』 cf. 今回の発表の元ネタ: BasicsOfFunctionalProgramming.md
Jetzt herunterladen