私の知る限り、特定のデータ型については意味がありません.1つの定義しか持てませんbind。
Haskell では、モナドは次の型クラスです。
instance Monad m where
return :: a -> m a
bind :: m a -> (a -> m b) -> m b
具体的には、私たちが持っているリストMonadに対して、
instance Monad [] where
return :: a -> [] a
(>>=) :: [] a -> (a -> [] b) -> [] b
次に、モナド関数を考えてみましょう。
actOnList :: a -> [] b
....
説明するユースケース、
$ [1,2,3] >>= actOnList
関数actOnListでは、リストが別の型によるポリモーフィックな型制約であることがわかります (こちら[])。次に、リストモナドのバインド演算子について話すときは、 によって定義されたバインド演算子について話し[] a -> (a -> [] b) -> [] bます。
あなたが達成したいのは、bind次のように定義された演算子です[] Maybe a -> (a -> [] b) -> [] b。これは最初のものの特化バージョンではなく、別の関数であり、型シグネチャに関して、bindあなたが持っているものを返さないので、それがあらゆる種類のモナドの演算子になる可能性があることを本当に疑っています消費されます。関数を使用してあるモナドから別のモナドに移動することは確かですが、この関数はbindリストの演算子の別のバージョンではありません。
これが私が言った理由です、特定のデータ型については意味がありません。私が知る限り、 の定義は 1 つしか持てませんbind。