私の知る限り、特定のデータ型については意味がありません.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
。