Задать вопрос

Разъяснить код на Haskell

не могли бы Вы мне разъяснить конкретный код на Hakell
{-# LANGUAGE OverloadedStrings #-}
import Data.Conduit
import Network.HTTP.Conduit
import qualified Data.Conduit.Binary as CB
import qualified Data.ByteString.Char8 as BS
import Control.Monad.Trans

main = do
  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
        }
  runResourceT $ do
    res <- http req' manager
    responseBody res $$+- CB.lines =$ counterSink

counterSink :: Sink BS.ByteString (ResourceT IO) ()
counterSink = do
  md <- await
  case md of
    Nothing -> return ()
    Just d -> do
      liftIO $ BS.putStrLn "--------"
      liftIO $ BS.putStrLn d
      counterSink

буду премного благодарен. тяжело понять хаскель
  • Вопрос задан
  • 2932 просмотра
Подписаться 3 Оценить 1 комментарий
Решения вопроса 1
@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:
--------
<данные>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы