SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
Functional Way
自己紹介: lagénorhynque
(defprofile lagénorhynque [Kent OHASHI]
:github/twitter @lagenorhynque
:company 株式会社オプト
:languages [Clojure Haskell Python Scala Go
English français Deutsch русский]
:interests [プログラミング 語学 数学])
「フィボナッチ数」( )の計算を例にFibonacci number
関数型プログラミングの基本的な概念を紹介
1. 再帰(recursion)
2. 末尾再帰(tail recursion)
3. 高階関数(higher-order function)
4. 遅延評価(lazy evaluation)
フィボナッチ数
番目のフィボナッチ数 は、以下のように定義される。i Fi
F0
F1
Fi
=
=
=
0
1
+ , i ≥ 2Fi−2 Fi−1
と続き、0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . .
直前の2項の和が次の項になっている。
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
変数やループ構造が目立ち、数学的な定義(プログラムの仕様)との関
係が分かりづらい
登場する変数が多くなったり、処理が複雑になったりすると、状態の
変化をたどるのが困難になりうる
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
数学的な再帰的定義をほぼそのまま表現した、シンプルなコード
可変状態がないため状態の変化を管理する必要がなくなり、並列/並
行処理として実行するのも比較的容易
関数呼出しの繰り返しによりスタックオーバーフローが発生する可能
性がある
フィボナッチ数の場合、同一の計算が繰り返されて計算量が指数的に
増大してしまう→メモ化( )を検討memoization
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)))
多くの関数型言語では末尾再帰関数が末尾呼出し最適化(tail call
optimization)により命令型のループと同等の処理に変換され、スタ
ックオーバーフローが防止できる
コードの処理内容も命令型ループによく似ている
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)))))
典型的な繰り返し処理は抽象化されたライブラリの高階関数に任せ、
固有のロジックを持った関数の実装に集中することで、効率良くコー
ディングすることができ、コードの可読性も向上する
オブジェクト指向プログラミングのデザインパターンの多くは高階関
数によって同等の目的を果たせる
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)))
-- 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)))
Haskellでは遅延評価がデフォルトの評価戦略
Clojureは先行評価が基本だが、遅延評価されるシーケンス(遅延シー
ケンス)が利用できる
特に巨大なデータ構造や無限に続くデータ構造を扱う場合に、シンプ
ルな定義と効率を両立させることができる
Further Reading
Haskell
『プログラミングHaskell』
『すごいHaskellたのしく学ぼう!』
『関数プログラミング実践入門』
Clojure
『プログラミングClojure』
Exploring Clojure with Factorial Computation
Scala
『Scalaスケーラブルプログラミング』
『Scala関数型デザイン&プログラミング』
Erlang
『すごいErlangゆかいに学ぼう!』
Elixir
『プログラミングElixir』
OCaml
『プログラミングの基礎』
cf. 今回の発表の元ネタ: BasicsOfFunctionalProgramming.md

Más contenido relacionado

Was ist angesagt?

並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナドKousuke Ruichi
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cythonAtsuo Ishimoto
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体digitalghost
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Yuichi Sakuraba
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream APIdcomsolution
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4Kenta Hattori
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについてdekosuke
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5Kenta Hattori
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオンHiroto Yamakawa
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyYuya Takeyama
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 

Was ist angesagt? (20)

並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 
C++11
C++11C++11
C++11
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン60分で体験する Stream / Lambda
 ハンズオン
60分で体験する Stream / Lambda
 ハンズオン
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 

Andere mochten auch

From Java To Clojure (English version)
From Java To Clojure (English version)From Java To Clojure (English version)
From Java To Clojure (English version)Kent Ohashi
 
Clojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しようClojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しようKeisuke Fukuda
 
Rプログラミング01 はじめの一歩
Rプログラミング01 はじめの一歩Rプログラミング01 はじめの一歩
Rプログラミング01 はじめの一歩wada, kazumi
 
Rデモ01_はじめの一歩2016
Rデモ01_はじめの一歩2016Rデモ01_はじめの一歩2016
Rデモ01_はじめの一歩2016wada, kazumi
 
ロジカル・シンキング & システム設計・プログラミングについて
ロジカル・シンキング & システム設計・プログラミングについてロジカル・シンキング & システム設計・プログラミングについて
ロジカル・シンキング & システム設計・プログラミングについてDai Saito
 
Rデモ02_入出力編2016
Rデモ02_入出力編2016Rデモ02_入出力編2016
Rデモ02_入出力編2016wada, kazumi
 
Rデモ03_データ分析編2016
Rデモ03_データ分析編2016Rデモ03_データ分析編2016
Rデモ03_データ分析編2016wada, kazumi
 
Rプログラミング02 データ入出力編
Rプログラミング02 データ入出力編Rプログラミング02 データ入出力編
Rプログラミング02 データ入出力編wada, kazumi
 
HTTP/2 in nginx(2016/3/11 社内勉強会)
HTTP/2 in nginx(2016/3/11 社内勉強会)HTTP/2 in nginx(2016/3/11 社内勉強会)
HTTP/2 in nginx(2016/3/11 社内勉強会)Yoko TAMADA
 
Rプログラミング03 データ分析編
Rプログラミング03 データ分析編Rプログラミング03 データ分析編
Rプログラミング03 データ分析編wada, kazumi
 
ネットワーク概論 サーバの構築理論
ネットワーク概論 サーバの構築理論ネットワーク概論 サーバの構築理論
ネットワーク概論 サーバの構築理論Takahiro Komatsu
 
Practical Phonetics (実践音声学)
Practical Phonetics (実践音声学)Practical Phonetics (実践音声学)
Practical Phonetics (実践音声学)Kent Ohashi
 

Andere mochten auch (14)

MP in Haskell
MP in HaskellMP in Haskell
MP in Haskell
 
From Java To Clojure (English version)
From Java To Clojure (English version)From Java To Clojure (English version)
From Java To Clojure (English version)
 
MP in Scala
MP in ScalaMP in Scala
MP in Scala
 
Clojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しようClojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しよう
 
Rプログラミング01 はじめの一歩
Rプログラミング01 はじめの一歩Rプログラミング01 はじめの一歩
Rプログラミング01 はじめの一歩
 
Rデモ01_はじめの一歩2016
Rデモ01_はじめの一歩2016Rデモ01_はじめの一歩2016
Rデモ01_はじめの一歩2016
 
ロジカル・シンキング & システム設計・プログラミングについて
ロジカル・シンキング & システム設計・プログラミングについてロジカル・シンキング & システム設計・プログラミングについて
ロジカル・シンキング & システム設計・プログラミングについて
 
Rデモ02_入出力編2016
Rデモ02_入出力編2016Rデモ02_入出力編2016
Rデモ02_入出力編2016
 
Rデモ03_データ分析編2016
Rデモ03_データ分析編2016Rデモ03_データ分析編2016
Rデモ03_データ分析編2016
 
Rプログラミング02 データ入出力編
Rプログラミング02 データ入出力編Rプログラミング02 データ入出力編
Rプログラミング02 データ入出力編
 
HTTP/2 in nginx(2016/3/11 社内勉強会)
HTTP/2 in nginx(2016/3/11 社内勉強会)HTTP/2 in nginx(2016/3/11 社内勉強会)
HTTP/2 in nginx(2016/3/11 社内勉強会)
 
Rプログラミング03 データ分析編
Rプログラミング03 データ分析編Rプログラミング03 データ分析編
Rプログラミング03 データ分析編
 
ネットワーク概論 サーバの構築理論
ネットワーク概論 サーバの構築理論ネットワーク概論 サーバの構築理論
ネットワーク概論 サーバの構築理論
 
Practical Phonetics (実践音声学)
Practical Phonetics (実践音声学)Practical Phonetics (実践音声学)
Practical Phonetics (実践音声学)
 

Ähnlich wie Functional Way

命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介fukuoka.ex
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
Control.Arrow
Control.ArrowControl.Arrow
Control.Arrowharu haru
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』Kenta USAMI
 
po-3. 式の抽象化と関数
po-3. 式の抽象化と関数po-3. 式の抽象化と関数
po-3. 式の抽象化と関数kunihikokaneko1
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ理 小林
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪yashigani
 

Ähnlich wie Functional Way (20)

ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
Control.Arrow
Control.ArrowControl.Arrow
Control.Arrow
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
po-3. 式の抽象化と関数
po-3. 式の抽象化と関数po-3. 式の抽象化と関数
po-3. 式の抽象化と関数
 
あらためてPHP5.3
あらためてPHP5.3あらためてPHP5.3
あらためてPHP5.3
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Haxeについて
HaxeについてHaxeについて
Haxeについて
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 

Mehr von Kent Ohashi

Team Geek Revisited
Team Geek RevisitedTeam Geek Revisited
Team Geek RevisitedKent 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 TechnologiesScala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt TechnologiesKent Ohashi
 
Clojureコレクションで探るimmutableでpersistentな世界
Clojureコレクションで探るimmutableでpersistentな世界Clojureコレクションで探るimmutableでpersistentな世界
Clojureコレクションで探るimmutableでpersistentな世界Kent Ohashi
 
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)Kent Ohashi
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングKent Ohashi
 
実用のための語源学入門
実用のための語源学入門実用のための語源学入門
実用のための語源学入門Kent Ohashi
 
メタプログラミング入門
メタプログラミング入門メタプログラミング入門
メタプログラミング入門Kent Ohashi
 
労働法の世界
労働法の世界労働法の世界
労働法の世界Kent Ohashi
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSLKent Ohashi
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門Kent Ohashi
 
たのしい多言語学習
たのしい多言語学習たのしい多言語学習
たのしい多言語学習Kent Ohashi
 
Ductモジュール入門
Ductモジュール入門Ductモジュール入門
Ductモジュール入門Kent Ohashi
 
Clojure REPL: The Good Parts
Clojure REPL: The Good PartsClojure REPL: The Good Parts
Clojure REPL: The Good PartsKent Ohashi
 
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy"Simple Made Easy" Made Easy
"Simple Made Easy" Made EasyKent Ohashi
 
Clojurian Conquest
Clojurian ConquestClojurian Conquest
Clojurian ConquestKent Ohashi
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixirKent Ohashi
 
GraphQL API in Clojure
GraphQL API in ClojureGraphQL API in Clojure
GraphQL API in ClojureKent Ohashi
 
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalInterceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalKent Ohashi
 

Mehr von Kent Ohashi (20)

Team Geek Revisited
Team Geek RevisitedTeam 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 TechnologiesScala 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な世界Clojureコレクションで探るimmutableでpersistentな世界
Clojureコレクションで探るimmutableでpersistentな世界
 
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)英語学習者のためのフランス語文法入門: フランス語完全理解(?)
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
 
実用のための語源学入門
実用のための語源学入門実用のための語源学入門
実用のための語源学入門
 
メタプログラミング入門
メタプログラミング入門メタプログラミング入門
メタプログラミング入門
 
労働法の世界
労働法の世界労働法の世界
労働法の世界
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSL
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門
 
GraphQL入門
GraphQL入門GraphQL入門
GraphQL入門
 
たのしい多言語学習
たのしい多言語学習たのしい多言語学習
たのしい多言語学習
 
Ductモジュール入門
Ductモジュール入門Ductモジュール入門
Ductモジュール入門
 
Clojure REPL: The Good Parts
Clojure REPL: The Good PartsClojure REPL: The Good Parts
Clojure REPL: The Good Parts
 
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
 
Clojurian Conquest
Clojurian ConquestClojurian Conquest
Clojurian Conquest
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixir
 
GraphQL API in Clojure
GraphQL API in ClojureGraphQL API in Clojure
GraphQL API in Clojure
 
法学入門
法学入門法学入門
法学入門
 
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalInterceptors: Into the Core of Pedestal
Interceptors: Into the Core of Pedestal
 

Functional Way