我相信很多人都看过这样的代码:
someFunc :: MaybeT IO ()
someFunc = do
foo1 <- MaybeT $ ...
foo2 <- MaybeT . return $ ...
foo3 <- lift $ ...
foo4 <- liftIO $ ...
...
我说的是MaybeT
,MaybeT . return
,lift
,liftIO
等。
这种类型的噪音使我的MaybeT
代码变得混乱。
我觉得有更好的方法。有吗?
答案 0 :(得分:2)
someFunc :: MaybeT IO ()
为了与下面的建议保持一致,重写someFunc :: (Alternative m, MonadIO m) => m ()
。这不是实现someFunc
所必需的,但是当其他操作未明确解除someFunc
monad中的其他操作时,需要在其他操作中使用MaybeT IO
。
someFunc = do
foo1 <- MaybeT $ ...
重写...
以使用return
和empty
代替return . Just
和return Nothing
。
foo2 <- MaybeT . return $ ...
重写...
以使用return
和empty
代替Just
和Nothing
。
foo3 <- lift $ ...
对于MaybeT IO
,lift
和liftIO
操作相同,请参阅下一个建议。在一般情况下(而不是特定于MaybeT IO
),将...
重写为具体monad所在的类的类型多态。
foo4 <- liftIO $ ...
对此无能为力。有时可以提供...
MonadIO
约束而不是IO
类型。通常,这只会改变liftIO
的位置;它必须出现在某个地方。