nem*_*ron 2 api haskell monad-transformers
只是在考虑API设计。Haskell中的“常见”是什么?类型签名还是“隐藏”的变形金刚?
findById :: ID -> IO (Maybe User)
findById x = runMaybeT $ do
...
return User
Run Code Online (Sandbox Code Playgroud)
要么
findById :: ID -> MaybeT IO User
findById x = do
...
return User
Run Code Online (Sandbox Code Playgroud)
如果这是为了简单起见,并且只有几个函数可以在IO中执行此操作,那么我只需要输入type即可IO (Maybe User)。
如果这是一个遍及您的库的模式,那么我将给tfm-stack monad一个半抽象的名称:
type Request = MaybeT IO
findById :: ID -> Request User
Run Code Online (Sandbox Code Playgroud)
... 甚至
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Request a = Request (runRequest :: MaybeT IO a)
deriving (Functor, Applicative, Monad)
Run Code Online (Sandbox Code Playgroud)
进行签名ID -> MaybeT IO User不是很好:转换器仅在您在该monad中执行大量操作时才有帮助,但是在这种情况下,总是写出MaybeT IO违反DRY原则。