делать обозначения для любого и, возможно, монад

#haskell

#haskell

Вопрос:

Существует метод:

 import Control.Applicative ((<$>))
import Network.HTTP.Types

getJSON :: String -> IO (Either String Value)
getJSON url = eitherDecode <$> simpleHttp url
  

И вместо этого:

 method1 :: String -> IO Object
method1 url = do
                maybeJson <- getJSON url
                case maybeJson of
                   jsonValue -> 
                    case jsonValue of
                      Object jsonObject -> return jsonObject
                      _ -> error "error123"
                  Left errorMsg -> error $ "error456"
  

Я могу сделать это:

 method1 :: String -> IO Object
method1 url = do
                Right jsonValue <- getJSON url
                case jsonValue of
                  Object jsonObject -> return jsonObject
                  _ -> error "error123"
  

Есть ли какой-либо способ упростить это еще больше без использования каких-либо библиотек, таких как lens?

Ответ №1:

Если вас не волнуют конкретные сообщения об ошибках, вы могли бы объединить шаблоны дальше:

 method1 url = do
                Right (Object jsonObject) <- getJSON url
                return jsonObject
  

Комментарии:

1. есть ли какой-нибудь способ сделать что-то вроде method1 url = getJSON url >>= return ??? ?

2. кажется, это работает method1 url = getJSON url >>= (Right (Object jsonObject)) -> return jsonObject

3. @AlexanderSupertramp Да, я подумывал написать это вместо ( do версия в основном представляет собой просто синтаксический сахар для этого), но решил, что разница невелика.