Трансформеры в типе подписи или нет? - PullRequest
2 голосов
/ 09 апреля 2019

Просто думаю о дизайне API. Что общего в Хаскеле? Трансформеры в типе подписи или точнее "скрытые"?

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

или

findById :: ID -> MaybeT IO User
findById x = do
  ...
  return User

1 Ответ

5 голосов
/ 09 апреля 2019

Если это для чего-то простого, и это всего лишь несколько функций, которые делают это, возможно, в IO, я бы просто сделал тип IO (Maybe User).

Если это шаблон, который простирается через вашбиблиотеке, я бы дал полуабстрактное имя монаде tfm-стека:

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 нарушает принцип СУХОГО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...