by shigemk2

当面は技術的なことしか書かない

関数合成

まず1つの関数を呼び出し、それからもう1つの関数にその結果を渡して呼び出したものに
等しい。

ただ、簡単に利用できるわけではなく、たとえば以下のように定義しなければならない
(すみません、僕の環境では>.>だとAmbiguous occurrenceなるエラーが出てしまったので
使えませんでした)

(#) :: (b -> c) -> (a -> b) -> a -> c
f # g = \x -> f (g x)

結果(リストを受け取って、tailしてsumしたものをnegateする関数

Main> map (negate # sum # tail) [[1..5],[3..6],[1..7]]
[-14,-15,-27]

このように書くことも出来ます。
関数合成 - 結城浩のHaskell日記 - haskell

($$) :: (a -> b) -> (b -> c) -> (a -> c)
($$) = flip (.)

f = (1+)
g = (2*)

Main> (f.g) 3
7
Main> (g$$f) 3
7