Monad"绑定"功能问题

Rn2*_*2dy 1 monads haskell

如果我像这样定义"绑定"函数:

(>>=) :: M a -> (a -> M' b) -> M' b
Run Code Online (Sandbox Code Playgroud)

如果我希望结果是新的Monad类型,或者我应该使用相同的Monad但是在同一个Monad框中使用b,那么这个定义会帮助我吗?

ken*_*ytm 7

正如我在评论提到过,我不认为这样的操作可以用于一般的单子(如安全地定义M = IO,M' = Maybe).

但是,如果M可以安全地转换为M',则此绑定可以定义为:

convert :: M1 a -> M2 a
...

(>>=*) :: M1 a -> (a -> M2 b) -> M2 b
x >>=* f = convert x >>= f
Run Code Online (Sandbox Code Playgroud)

相反,

convert x = x >>=* return
Run Code Online (Sandbox Code Playgroud)

一些这样的安全转换方法是maybeToList(可能→[]),listToMaybe([]→可能),stToIO(ST RealWorld→IO),...请注意,convert任何monad 都没有通用方法.