清理MaybeT中的噪音

时间:2016-11-16 20:08:42

标签: haskell

我相信很多人都看过这样的代码:

someFunc :: MaybeT IO ()
someFunc = do
    foo1 <- MaybeT $ ...
    foo2 <- MaybeT . return $ ...
    foo3 <- lift $ ...
    foo4 <- liftIO $ ...
    ...

我说的是MaybeTMaybeT . returnliftliftIO等。

这种类型的噪音使我的MaybeT代码变得混乱。

我觉得有更好的方法。有吗?

1 个答案:

答案 0 :(得分:2)

someFunc :: MaybeT IO ()

为了与下面的建议保持一致,重写someFunc :: (Alternative m, MonadIO m) => m ()。这不是实现someFunc所必需的,但是当其他操作未明确解除someFunc monad中的其他操作时,需要在其他操作中使用MaybeT IO

someFunc = do
    foo1 <- MaybeT $ ...

重写...以使用returnempty代替return . Justreturn Nothing

    foo2 <- MaybeT . return $ ...

重写...以使用returnempty代替JustNothing

    foo3 <- lift $ ...

对于MaybeT IOliftliftIO操作相同,请参阅下一个建议。在一般情况下(而不是特定于MaybeT IO),将...重写为具体monad所在的类的类型多态。

    foo4 <- liftIO $ ...

对此无能为力。有时可以提供... MonadIO约束而不是IO类型。通常,这只会改变liftIO的位置;它必须出现在某个地方。