Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Functional Way

Kent OHASHI
September 24, 2016

Functional Way

フィボナッチ数の計算を例に関数型プログラミングの基本的な概念を紹介。
関数型プログラミングを始めよう!

Kent OHASHI

September 24, 2016
Tweet

More Decks by Kent OHASHI

Other Decks in Programming

Transcript

  1. ( d e f p r o f i l

    e l a g é n o r h y n q u e [ K e n t O H A S H I ] : g i t h u b / t w i t t e r @ l a g e n o r h y n q u e : c o m p a n y 株式会社オプト : l a n g u a g e s [ C l o j u r e H a s k e l l P y t h o n S c a l a G o E n g l i s h f r a n ç a i s D e u t s c h р у с с к и й ] : i n t e r e s t s [ プログラミング 語学 数学] )
  2. 「 フィボナッチ数」( ) の計算を例に Fibonacci number 関数型プログラミングの基本的な概念を紹介 1. 再帰 (recursion)

    2. 末尾再帰 (tail recursion) 3. 高階関数 (higher-order function) 4. 遅延評価 (lazy evaluation)
  3. フィボナッチ数 番目のフィボナッチ数 は、 以下のように定義される。 i F i F 0 F

    1 F i = = = 0 1 + , i ≥ 2 F i −2 F i −1 と続き、 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . . 直前の2 項の和が次の項になっている。
  4. 0. ルー プ 手続き型( ) 言語の基本パター ン procedural # P

    y t h o n d e f f i b o n a c c i ( i ) : a , b = 0 , 1 f o r n i n r a n g e ( i ) : a , b = b , a + b r e t u r n a 副作用( ) 命令型( ) side e ect imperative
  5. 1. 再帰 ( ) recursion 関数型( ) 言語の基本パター ン functional

    - - H a s k e l l f i b o n a c c i 1 : : I n t - > I n t e g e r f i b o n a c c i 1 0 = 0 f i b o n a c c i 1 1 = 1 f i b o n a c c i 1 i = f i b o n a c c i 1 ( i - 2 ) + f i b o n a c c i 1 ( i - 1 ) ; ; C l o j u r e ( d e f n f i b o n a c c i 1 [ i ] ( c o n d ( = i 0 ) 0 N ( = i 1 ) 1 N : e l s e ( + ( f i b o n a c c i 1 ( - i 2 ) ) ( f i b o n a c c i 1 ( - i 1 ) ) ) ) ) パター ンマッチング( ) 宣言型( ) 参照透過性( ) pattern matching declarative referential transparency
  6. 2. 末尾再帰 ( ) tail recursion 関数内部で最後に実行される処理が再帰呼出しになっている再帰 - - H

    a s k e l l f i b o n a c c i 2 : : I n t - > I n t e g e r f i b o n a c c i 2 i = f i b i 0 1 w h e r e f i b 0 a _ = a f i b n a b = f i b ( n - 1 ) b ( a + b ) ; ; C l o j u r e ( d e f n f i b o n a c c i 2 [ i ] ( l e t f n [ ( f i b [ n a b ] ( i f ( z e r o ? n ) a ( r e c u r ( d e c n ) b ( + a b ) ) ) ) ] ( f i b i 0 N 1 N ) ) )
  7. 3. 高階関数 ( ) higher-order function 引数として関数を受け取る、 または戻り値として関数を返す関数 - -

    H a s k e l l f i b o n a c c i 3 : : I n t - > I n t e g e r f i b o n a c c i 3 i = f s t $ f o l d l ' f i b ( 0 , 1 ) [ 1 . . i ] w h e r e f i b ( a , b ) _ = ( b , a + b ) ; ; C l o j u r e ( d e f n f i b o n a c c i 3 [ i ] ( l e t f n [ ( f i b [ [ a b ] _ ] [ b ( + a b ) ] ) ] ( f i r s t ( r e d u c e f i b [ 0 N 1 N ] ( r a n g e 0 i ) ) ) ) )
  8. 4. 遅延評価 ( ) lazy evaluation 式の評価を計算で必要になるまで遅らせる評価戦略 cf. 先行評価( )

    eager evaluation - - H a s k e l l f i b o n a c c i 4 : : I n t - > I n t e g e r f i b o n a c c i 4 i = f i b s ! ! i w h e r e f i b s = m a p f s t $ i t e r a t e ( \ ( a , b ) - > ( b , a + b ) ) ( 0 , 1 ) ; ; C l o j u r e ( d e f n f i b o n a c c i 4 [ i ] ( l e t [ f i b s ( m a p f i r s t ( i t e r a t e ( f n [ [ a b ] ] [ b ( + a b ) ] ) [ 0 N 1 N ] ) ) ] ( n t h f i b s i ) ) )
  9. - - H a s k e l l f

    i b o n a c c i 5 : : I n t - > I n t e g e r f i b o n a c c i 5 i = f i b s ! ! i w h e r e f i b s = 0 : 1 : z i p W i t h ( + ) f i b s ( t a i l f i b s ) ; ; C l o j u r e ( d e f n f i b o n a c c i 5 [ i ] ( l e t f n [ ( f i b s [ a b ] ( c o n s a ( l a z y - s e q ( f i b s b ( + a b ) ) ) ) ) ] ( n t h ( f i b s 0 N 1 N ) i ) ) )
  10. Further Reading Haskell 『 プログラミングHaskell』 『 すごいHaskell たのしく学ぼう!』 『 関数プログラミング実践入門』

    Clojure 『 プログラミングClojure』 Exploring Clojure with Factorial Computation Scala 『Scala スケー ラブルプログラミング』 『Scala 関数型デザイン& プログラミング』