モナド的な汎用関数
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/01/16 04:57 UTC 版)
「モナド (プログラミング)」の記事における「モナド的な汎用関数」の解説
安全な割り算の結果は、値が Nothing であるかを素直に確認せずに(つまり割り算の結果があるかを確認せずに)そのまま計算に使えたほうが便利なことがある。これは「持ち上げ(英語版)」関数を使うことで可能である。この関数は Maybe に限定されず、任意のモナドに対して定義される。Haskellでは LiftM2 と呼ばれる。 liftM2 :: Monad m => (a -> b -> c) -> m a -> m b -> m cliftM2 op mx my = do x <- mx y <- my return (op x y) 関数型を示す矢印が右結合であることから、liftM2は2引数の関数を引数に取って、さらなる2引数の関数を返す。型シグネチャは m がモナドのとき、任意の2引数関数を「持ち上げ」ることができることを示している。例えば、 (.*.) :: (Monad m, Num a) => m a -> m a -> m ax .*. y = liftM2 (*) x y は演算子 (.*.) を定義し、それは引数がどちらも Nothing でないときに、掛け算した結果を返す(どちらかが Nothing の場合は Nothing を返す)。この方法の利点はモナドの実装に深入りする必要がないことである。他の同じような関数やモナドを使う場合でも、liftM2 を使うことで、やりたいことが鮮明になる(コードの再利用を見よ)。 数学的には、liftM2 は次のように定義される。 liftM2 : ∀ M : monad , ( A 1 → A 2 → R ) → M A 1 → M A 2 → M R = {\displaystyle {\text{liftM2}}\colon \forall M\colon {\text{monad}},\;(A_{1}\to A_{2}\to R)\to M\,A_{1}\to M\,A_{2}\to M\,R=} o p ↦ m 1 ↦ m 2 ↦ bind m 1 ( a 1 ↦ bind m 2 ( a 2 ↦ return ( o p a 1 a 2 ) ) ) {\displaystyle op\mapsto m_{1}\mapsto m_{2}\mapsto {\text{bind}}\;m_{1}\;(a_{1}\mapsto {\text{bind}}\;m_{2}\;(a_{2}\mapsto {\text{return}}\;(op\,a_{1}\,a_{2})))}
※この「モナド的な汎用関数」の解説は、「モナド (プログラミング)」の解説の一部です。
「モナド的な汎用関数」を含む「モナド (プログラミング)」の記事については、「モナド (プログラミング)」の概要を参照ください。
- モナド的な汎用関数のページへのリンク