1 Question: Transformers en type signature ou pas?

question créée à Tue, Apr 9, 2019 12:00 AM

Je pense juste à une conception d’API. Qu'est-ce qui est "commun" en Haskell? Des transformateurs en signature de type ou plutôt "cachés"?

findById :: ID -> IO (Maybe User)
findById x = runMaybeT $ do
  ...
  return User

ou

findById :: ID -> MaybeT IO User
findById x = do
  ...
  return User
    
2
  1. Une troisième alternative à considérer: une des (MonadIO m, Alternative m) => ID -> m User s'il n'y a vraiment aucune information d'erreur intéressante à rapporter, ou 0600350991111101035062 s'il y en a une.
    2019-04-09 13: 33: 18Z
1 Réponses                              1                         

Si c'est pour quelque chose de simple, et que seules quelques fonctions font cela peut-être en IO, je créerais simplement le type (MonadIO m, MonadError MyFancyError m) => ID -> m User.

S'il s'agit d'un motif qui s'étend sur votre bibliothèque, je donnerais un nom semi-abstrait à la monade tfm-stack:

IO (Maybe User)

... ou même

type Request = MaybeT IO

findById :: ID -> Request User

Faire la signature

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Request a = Request (runRequest :: MaybeT IO a)
   deriving (Functor, Applicative, Monad)
n’est pas très bon: le transformateur n’aide que si vous faites tout un tas d’actions dans cette monade, mais dans ce cas, écrire 060035099111111101035062 enfreint le principe de DRY.     
5
2019-04-09 11: 53: 27Z
  1. par intérêt, 0600350991111101035062 ressemblerait alors à ID -> MaybeT IO User Droite?
    2019-04-09 12: 16: 33Z
  2. Ouais. Si vous dérivez également 060035099111110101035062 alors vous pouvez simplifier le cas d'échec au MaybeT IO.
    2019-04-09 14: 57: 49Z
findById
source placée ici