-> Maybe (Req Object)
decodeToReq = decode :: ByteString -> Maybe (Req Object)
toRPCRequest :: RequestParamsParser a => ByteString -> Maybe (Req (Maybe a))
toRPCRequest body = fmap (fmap requestParamsParse) (decodeToReq body)
class RequestParamsParser a where
requestParamsParse :: Object -> Maybe a
В конце парсинга выходит неудобный тип:
Maybe (Req (Maybe a))
С этим крайне неудобно будет работать в будущем в другом контексте, к примеру, в IO
Надо бы как-то 2 Maybe сконкатинировать в 1 Мэйби, так как не имеет это смысла хранить 2 результата вычисления цепочки Maybe, и получить это:
Maybe
(Req a)
Вопрос: Как от подобных конструкций можно избавиться, есть какие-нибудь советы? Скорее вероятно, что мне нужно просто пересмотреть свою точку зрения на мой тип Req и его парсинг, но надеюсь, что эта проблема обобщается во что-то готовое.
Раздел Application in Functors может помочь https://en.m.wikibooks.org/wiki/Haskell/Applicative_functors
для сокращения Maybe Maybe -> Maybe есть join (а также bind и вообще монады), но у вас между ними Req, поэтому надо сначала вытащить Object из Req Object с помощью средств Req
Обсуждают сегодня