如果我像这样定义"绑定"函数:
(>>=) :: M a -> (a -> M' b) -> M' b
Run Code Online (Sandbox Code Playgroud)
如果我希望结果是新的Monad类型,或者我应该使用相同的Monad但是在同一个Monad框中使用b,那么这个定义会帮助我吗?
正如我在评论提到过,我不认为这样的操作可以用于一般的单子(如安全地定义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 都没有通用方法.
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |