fugafuga.write

日々のログ

すごいH本 part15

高階関数

引数に関数を受け取ったり、関数を返すような関数を高階関数という。

Haskell を学ぶ上でとても大事な考え方らしい。

カリー化関数

カリー化関数とは複数の引数を取る代わりに、常にちょうど1つの引数を取る関数です。

カリー化関数が呼び出されると、その次の引数を受け取る関数を返す。

*Main> max 2 5
5
*Main> (max 2) 5
5

(max 2)5 を引数として受け取る関数を返している。今までみてきた Haskell の関数はすべてカリー化されていて、複数の引数をとる関数も1つの引数をとる関数の組み合わせとして表現されている。

部分適用

複数引数を取る関数に1つだけ引数を渡すと、部分適用された関数が得られる。

これが

*Main> :t max
max :: Ord a => a -> a -> a

こういうこと

*Main> :t max
max :: Ord a => a -> (a -> a)

(a -> a)という関数を返している。

例として、引数を3つ取りそれらを乗算した結果を返す関数を書く

multThree :: Int -> Int -> Int -> Int
multThree x y z = x * y * z

実行結果

*Main> multThree 9 5 1
45

部分適用してみる

*Main> let multTwoWithNine = multThree 9
*Main> multTwoWithNine 2 5
90

関数のシグネチャはこうなる

*Main> :t multThree
multThree :: Int -> Int -> Int -> Int
*Main> :t multTwoWithNine
multTwoWithNine :: Int -> Int -> Int

セクション

中置関数にもセクションという機能を使って部分適用することができる。

divideByTen :: (Floating a) => a -> a
divideByTen = (/10)

中置関数の片側に値を書いて括弧でくくると部分適用となる。

実行結果

*Main> divideByTen 200
20.0
*Main> 200 / 10
20.0
*Main> (/10) 200
20.0

所感

高階関数もカリー化も部分適用もなんとなくわかった。しかし実際これらがどのように役に立つのかが実感できていないのでなんとも。という感じ。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る