Ответы пользователя по тегу Haskell
  • Разъяснить код на Haskell

    @malerix
    Плохо в этом разбираюсь, но всё же попробую прокомментировать:
    Вначале импортируются модули из библиотек:
    conduit - для работы с потоками данных (если я не ошибаюсь, раньше пользовались iteratee для этих целей);
    http-conduit - "расширение" для Network.HTTP для работы с этим conduit;
    Binary, ByteString - думаю, понятно - для преобразований типов данных.

    Создаём менеджер соединений из дефолтных настроек
    manager <- newManager def
    Создаём запрос:
    req <- parseUrl "http://localhost:8080/api/v1.0/streams/counter"

    Затем дополняем заголовки в запросе:
    let headers = requestHeaders req
          req' = req {
              requestHeaders = ("Accept", "application/x-json-stream") :
                               headers
            }

    "Безопасно" (тут я навряд ли смогу точно описать, лучше почитать документацию) "запускается" монада. Что-то вроде try, только с потокобезопасностью и прочим.
    runResourceT $ do
        res <- http req' manager
        responseBody res $$+- CB.lines =$ counterSink

    Здесь вешаем (=$) обработчик "counterSink", который будет ждать получения всех данных ($$+-), причём уже в виде строк (CB.lines).
    Функция counterSink ждёт данные, и, если они пришли, выводит в stdout:
    --------
    <данные>
    Ответ написан
    Комментировать