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