For a certain data type, it makes no sense, as far as I know, for bind can be only one definition.
In haskell, the monad is the next type of class,
instance Monad m where return :: a -> ma bind :: ma -> (a -> mb) -> mb
Specifically, for the list of Monad we have,
instance Monad [] where return :: a -> [] a (>>=) :: [] a -> (a -> [] b) -> [] b
Now consider the monadic function as.
actOnList :: a -> [] b ....
A usage example to illustrate
$ [1,2,3] >>= actOnList
In the actOnList function actOnList we see that a list is a restriction of a polymorphic type to another type (here [] ). Then, when we talk about the binding operation for the list monad, we talk about the binding operator defined by [] a -> (a -> [] b) -> [] b .
What you want to achieve is the bind operator, defined as [] Maybe a -> (a -> [] b) -> [] b , this is not a special version of the first, but another function, and with respect to this signature of type I really doubt it could be the bind operator of any monad, since you are not returning what you consume. You are sure to switch from one monad to another using a function, but this function is definitely not a different version of the list bind operator.
That's why I said: "It doesn’t make sense, for a certain data type, as far as I know, you can only have one definition for bind .