Submit Search
Functional Way
0 likes
495 views
Kent Ohashi
フィボナッチ数の計算を例に関数型プログラミングの基本的な概念を紹介。 関数型プログラミングを始めよう!
Software
Read more
1 of 18
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
More Related Content
PDF
おいしいLisp
Kent Ohashi
PDF
From Java To Clojure
Kent Ohashi
PDF
From JS To CLJS
Kent Ohashi
PDF
C++14 Overview
Akira Takahashi
PPTX
大人のお型付け
Nobuhisa Koizumi
PDF
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
PDF
More C++11
京大 マイコンクラブ
PDF
C++ lecture-2
sunaemon
おいしいLisp
Kent Ohashi
From Java To Clojure
Kent Ohashi
From JS To CLJS
Kent Ohashi
C++14 Overview
Akira Takahashi
大人のお型付け
Nobuhisa Koizumi
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
More C++11
京大 マイコンクラブ
C++ lecture-2
sunaemon
What's hot
(20)
PDF
並行プログラミングと継続モナド
Kousuke Ruichi
PPTX
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
PDF
C++11
京大 マイコンクラブ
PPTX
Visual C++で使えるC++11
nekko1119
PDF
Fork/Join Framework。そしてLambdaへ。
Yuichi Sakuraba
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
dcomsolution
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
PPT
言語処理系入門4
Kenta Hattori
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
PDF
組み込みでこそC++を使う10の理由
kikairoya
PDF
JavaScript 講習会 #1
Susisu
PDF
C++ lecture-0
sunaemon
PPTX
Scalamacrosについて
dekosuke
PDF
F#によるFunctional Programming入門
bleis tift
PPT
言語処理系入門5
Kenta Hattori
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
PDF
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
PDF
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
PDF
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
PDF
Python で munin plugin を書いてみる
ftnk
並行プログラミングと継続モナド
Kousuke Ruichi
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
C++11
京大 マイコンクラブ
Visual C++で使えるC++11
nekko1119
Fork/Join Framework。そしてLambdaへ。
Yuichi Sakuraba
【java8 勉強会】 怖くない!ラムダ式, Stream API
dcomsolution
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
言語処理系入門4
Kenta Hattori
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
組み込みでこそC++を使う10の理由
kikairoya
JavaScript 講習会 #1
Susisu
C++ lecture-0
sunaemon
Scalamacrosについて
dekosuke
F#によるFunctional Programming入門
bleis tift
言語処理系入門5
Kenta Hattori
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
Python で munin plugin を書いてみる
ftnk
Ad
Viewers also liked
(14)
PDF
MP in Haskell
Kent Ohashi
PDF
From Java To Clojure (English version)
Kent Ohashi
PDF
MP in Scala
Kent Ohashi
PPTX
Clojure座談会 #1 LT 独自コレクションを定義しよう
Keisuke Fukuda
PPTX
Rプログラミング01 はじめの一歩
wada, kazumi
DOCX
Rデモ01_はじめの一歩2016
wada, kazumi
PDF
ロジカル・シンキング & システム設計・プログラミングについて
Dai Saito
DOCX
Rデモ02_入出力編2016
wada, kazumi
DOCX
Rデモ03_データ分析編2016
wada, kazumi
PPTX
Rプログラミング02 データ入出力編
wada, kazumi
PDF
HTTP/2 in nginx(2016/3/11 社内勉強会)
Yoko TAMADA
PPTX
Rプログラミング03 データ分析編
wada, kazumi
PDF
ネットワーク概論 サーバの構築理論
Takahiro Komatsu
PDF
Practical Phonetics (実践音声学)
Kent Ohashi
MP in Haskell
Kent Ohashi
From Java To Clojure (English version)
Kent Ohashi
MP in Scala
Kent Ohashi
Clojure座談会 #1 LT 独自コレクションを定義しよう
Keisuke Fukuda
Rプログラミング01 はじめの一歩
wada, kazumi
Rデモ01_はじめの一歩2016
wada, kazumi
ロジカル・シンキング & システム設計・プログラミングについて
Dai Saito
Rデモ02_入出力編2016
wada, kazumi
Rデモ03_データ分析編2016
wada, kazumi
Rプログラミング02 データ入出力編
wada, kazumi
HTTP/2 in nginx(2016/3/11 社内勉強会)
Yoko TAMADA
Rプログラミング03 データ分析編
wada, kazumi
ネットワーク概論 サーバの構築理論
Takahiro Komatsu
Practical Phonetics (実践音声学)
Kent Ohashi
Ad
Similar to Functional Way
(20)
PDF
ALPSチュートリアル(4) Python入門
Computational Materials Science Initiative
PDF
たのしい関数型
Shinichi Kozake
PDF
命令プログラミングから関数プログラミングへ
Naoki Kitora
PPTX
やや関数型を意識した風Elixir/Phoenixご紹介
fukuoka.ex
PPT
言語処理系入門10
Kenta Hattori
PPTX
Control.Arrow
haru haru
PDF
Everyday Life with clojure.spec
Kent Ohashi
PDF
研究生のためのC++ no.2
Tomohiro Namba
PDF
関数プログラミング入門
Hideyuki Tanaka
PDF
Rの高速化
弘毅 露崎
PDF
たのしい高階関数
Shinichi Kozake
PDF
Subprocess no susume
Makoto Kishimoto
PDF
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI
KEY
あらためてPHP5.3
Masashi Shinbara
PDF
Lisp tutorial for Pythonista : Day 2
Ransui Iso
PDF
Haxeについて
Moriyoshi Koizumi
PDF
Python勉強会4-制御構文とパッケージ
理 小林
PDF
Pfi Seminar 2010 1 7
Preferred Networks
PDF
すごいHaskell読書会#1 in 大阪
yashigani
PPTX
Polyphony の並列化
ryos36
ALPSチュートリアル(4) Python入門
Computational Materials Science Initiative
たのしい関数型
Shinichi Kozake
命令プログラミングから関数プログラミングへ
Naoki Kitora
やや関数型を意識した風Elixir/Phoenixご紹介
fukuoka.ex
言語処理系入門10
Kenta Hattori
Control.Arrow
haru haru
Everyday Life with clojure.spec
Kent Ohashi
研究生のためのC++ no.2
Tomohiro Namba
関数プログラミング入門
Hideyuki Tanaka
Rの高速化
弘毅 露崎
たのしい高階関数
Shinichi Kozake
Subprocess no susume
Makoto Kishimoto
関数型都市忘年会『はじめての函数型プログラミング』
Kenta USAMI
あらためてPHP5.3
Masashi Shinbara
Lisp tutorial for Pythonista : Day 2
Ransui Iso
Haxeについて
Moriyoshi Koizumi
Python勉強会4-制御構文とパッケージ
理 小林
Pfi Seminar 2010 1 7
Preferred Networks
すごいHaskell読書会#1 in 大阪
yashigani
Polyphony の並列化
ryos36
More from Kent Ohashi
(20)
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Kent Ohashi
PDF
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
Kent Ohashi
PDF
From Scala/Clojure to Kotlin
Kent Ohashi
PDF
TDD with RDD: Clojure/LispのREPLで変わる開発体験
Kent Ohashi
PDF
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
Kent Ohashi
PDF
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
Kent Ohashi
PDF
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
Kent Ohashi
PDF
Kotlin Meets Data-Oriented Programming: Kotlinで実践する「データ指向プログラミング」
Kent Ohashi
PDF
RDBでのツリー表現入門2024
Kent Ohashi
PDF
ミュータビリティとイミュータビリティの狭間: 関数型言語使いから見たKotlinコレクション
Kent Ohashi
PDF
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
Kent Ohashi
PDF
Team Geek Revisited
Kent Ohashi
PDF
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Kent Ohashi
PDF
Clojureコレクションで探るimmutableでpersistentな世界
Kent Ohashi
PDF
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
Kent Ohashi
PDF
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
Kent Ohashi
PDF
実用のための語源学入門
Kent Ohashi
PDF
メタプログラミング入門
Kent Ohashi
PDF
労働法の世界
Kent Ohashi
PDF
Clojureで作る"simple"なDSL
Kent Ohashi
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Kent Ohashi
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
Kent Ohashi
From Scala/Clojure to Kotlin
Kent Ohashi
TDD with RDD: Clojure/LispのREPLで変わる開発体験
Kent Ohashi
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
Kent Ohashi
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
Kent Ohashi
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
Kent Ohashi
Kotlin Meets Data-Oriented Programming: Kotlinで実践する「データ指向プログラミング」
Kent Ohashi
RDBでのツリー表現入門2024
Kent Ohashi
ミュータビリティとイミュータビリティの狭間: 関数型言語使いから見たKotlinコレクション
Kent Ohashi
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
Kent Ohashi
Team Geek Revisited
Kent Ohashi
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Kent Ohashi
Clojureコレクションで探るimmutableでpersistentな世界
Kent Ohashi
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
Kent Ohashi
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
Kent Ohashi
実用のための語源学入門
Kent Ohashi
メタプログラミング入門
Kent Ohashi
労働法の世界
Kent Ohashi
Clojureで作る"simple"なDSL
Kent Ohashi
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
Download