Трансформеры типа подпись или нет?

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

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

или

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

Третий вариант для рассмотрения: один из (MonadIO m, Alternative m) => ID -> m User, если действительно нет интересной информации об ошибках, о которой вы могли бы сообщить, или (MonadIO m, MonadError MyFancyError m) => ID -> m User, если она есть.

Daniel Wagner 09.04.2019 15:33
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
2
1
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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 нарушает принцип DRY.

ради интереса, findById тогда будет выглядеть findById :: ID -> Request User \n findById 1 = return User \n findById _ = Request . MaybeT $ return Nothing Верно?

nemron 09.04.2019 14:16

Да. Если вы также получите Alternative, вы можете упростить случай отказа до findById _ = empty.

leftaroundabout 09.04.2019 16:57

Другие вопросы по теме