Api 变压器是否有类型签名?
考虑一下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
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
。