变压器是否具有类型签名?

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)

lef*_*out 5

如果这是为了简单起见,并且只有几个函数可以在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原则。