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

Api 变压器是否有类型签名?,api,haskell,monad-transformers,Api,Haskell,Monad Transformers,考虑一下API设计。哈斯克尔的“共同点”是什么?类型签名中的变压器还是“隐藏” findById::ID->IO(可能是用户) findById x=runMaybeT$do ... 返回用户 或 findById::ID->MaybeT IO用户 findById x=do ... 返回用户 如果这是为了一些简单的东西,并且只有一些函数可以在IO中实现这一点,那么我只需要将类型设置为IO(可能是用户) 如果这是一个延伸到整个库的模式,我会给tfm堆栈monad起一个半抽象的名称: type

考虑一下API设计。哈斯克尔的“共同点”是什么?类型签名中的变压器还是“隐藏”

findById::ID->IO(可能是用户)
findById x=runMaybeT$do
...
返回用户

findById::ID->MaybeT IO用户
findById x=do
...
返回用户

如果这是为了一些简单的东西,并且只有一些函数可以在IO中实现这一点,那么我只需要将类型设置为
IO(可能是用户)

如果这是一个延伸到整个库的模式,我会给tfm堆栈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
不是很好:只有当您在单子中执行一系列操作时,转换器才有帮助,但在这种情况下,总是写出
MaybeT IO
违反了干式原则。

为了兴趣,
findById
将看起来像
findById::ID->Request User\n findById 1=返回用户\n findById\uu=请求。可以打赌$return Nothing
对吗?是的。如果您还进行了推导,那么您可以将故障案例简化为
findById\uu=empty
。第三种选择是:如果您确实没有可以报告的有趣错误信息,则考虑
(MonadIO m,alternative m)=>ID->m User
,或者
(MonadIO m,MonadError myfankyerror m)=>ID->m User