Contenu connexe
Similaire à Functional Way (20)
Functional Way
- 3. (defprofile lagénorhynque [Kent OHASHI]
:github/twitter @lagenorhynque
:company 株式会社オプト
:languages [Clojure Haskell Python Scala Go
English français Deutsch русский]
:interests [プログラミング 語学 数学])
- 5. フィボナッチ数
番目のフィボナッチ数 は、以下のように定義される。i Fi
F0
F1
Fi
=
=
=
0
1
+ , i ≥ 2Fi−2 Fi−1
と続き、0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . .
直前の2項の和が次の項になっている。
- 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
- 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)))