TL;DR
「通常」の値を受け取り、ある種の「拡張」された値を返す関数。Domain Modeling Made Functional では、Result を返す関数をスイッチ関数と呼んでおり、これがモナディック関数に当たる。
なぜ必要か
Domain Modeling Made Functional 第10章によると、前の関数の出力は成功か失敗の 2 トラックで、次の関数の入力は 1 トラックなので、Result を返す関数はそのままでは合成できない。モナディック関数を合成する方法として、モナドやアプリカティブがある。
仕組み
Domain Modeling Made Functional 第10章によると、モナディック関数を直列につなげるのがモナドで、並列に組み合わせるのがアプリカティブである。直列につなぐには bind(flatMap、Haskell の >>=)を使い、モナディック関数を 2 トラックの関数に変換する。
例
F# では、Result を返す関数を Result.bind でつなげる。
type FunctionA = Apple -> Result<Bananas, ...>
type FunctionB = Bananas -> Result<Cherries, ...>
let functionAB input =
input
|> functionA
|> Result.bind functionB