mushroompot

mushroompot

全栈,全干,全菜。 be a fullstack man, just for fun!
twitter

関数型プログラミングの三種の神器(map、filter、fold)

map、filter、fold とは何ですか#

map#

map は関数とリストを受け取り、関数をリストの各要素に適用し、最終的に関数が適用されたリストを返します。

Haskellでのmapの型シグネチャ
map :: (a -> b) -> [a] -> [b]

Racketのコード
(define (mymap function mylist)
  (cond
     ((null? mylist) '())
     (else (cons (function (car mylist)) (mymap function (cdr mylist)) ))
  )
)
(define (add2 x) (+ 2 x))
(mymap add2 '(1 2 3 4 5 6 7 8))

=> (3 4 5 6 7 8 9 10)

filter#

その名の通り、リストから条件に合致する値を抽出します。

Haskellでのfilterの型シグネチャ
filter :: (a -> Bool) -> [a] -> [a]

Racketのコード
(define (myfilter condition? mylist)
  (cond
    ((null? mylist) '())
    ((condition? (car mylist)) (cons (car mylist) (myfilter condition? (cdr mylist))))
    (else (myfilter condition? (cdr mylist)))
  )
)

(define (odd? a)
  (eq? (modulo a 2) 1)
)

(myfilter odd? '(-1 -2 -3 -4 -5 -6 -7 -8 -9 -10))
=> (-1 -3 -5 -7 -9)

fold#

fold は折りたたむという意味で、通常、左折りたたみと右折りたたみに分けられます。

ここでは左折りたたみ(foldl)を例に取ります。

Haskellでのfoldlの型シグネチャ
foldl :: (a -> b -> a) -> a -> [b] -> a

Racketのコード
(define (myfoldl base function mylist)
  (cond
     ((null? mylist) base)
     (else (myfoldl (function base (car mylist)) function (cdr mylist)))
  )
)

(define (add x y)
  (+ x y)
)

(myfoldl 0 add '(1 2 3 4 5 6 7 8 9))
=> 45
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。