Из HTTPoison
README:
Обычно hackney открывает и закрывает соединения по требованию , но также создает пул по умолчанию соединений, которые повторно используются для запросов к одному и тому же хосту. Если соединение и хост поддерживают keepalive, соединение остается открытым до тех пор, пока оно не будет явно закрыто.
blockquote>
HTTPoison
не экспортируетclose
для базового сокета, и с 2017 года существует открытый выпуск для этого.Между тем, вы можете позвонить
hackney_pool:stop_pool(:default)
. Это, очевидно, не оптимальное решение в любом случае, и оно имеет огромные накладные расходы. Поэтому я бы посоветовал либо отправить запрос на включениеHTTPoison
, включив функцию закрытия соединения (через делегирование;hackney_response.close/1
) или , просто избавиться от избыточностиHTTPoison
и просто используйтеhackney
.
На самом деле, в некотором смысле, join
- это то место, где действительно происходит вся магия - (>> =)
используется в основном для удобства.
Все классы типов на основе Functor
описывают дополнительную структуру с помощью некоторого типа. В Functor
эта дополнительная структура часто рассматривается как «контейнер», в то время как в Monad
она обычно рассматривается как «побочные эффекты», но они всего лишь (иногда вводящие в заблуждение) сокращенные - в любом случае это одно и то же, и на самом деле ничего особенного [0].
Отличительной особенностью Монады
по сравнению с другими Функторами
является то, что он может встраивать поток управления в дополнительную структуру. Причина, по которой он может это сделать, заключается в том, что, в отличие от fmap
, который применяет одну плоскую функцию ко всей структуре, (>> =)
проверяет отдельные элементы и строит новые ] структура из этого.
С простым функтором
построение новой структуры из каждой части исходной структуры вместо этого вложило бы Functor
, причем каждый уровень представлял бы точку потока управления. Это, очевидно, ограничивает полезность, так как результат беспорядочный и имеет тип, который отражает структуру используемого управления потоком.
Монадические «побочные эффекты» - это структуры, которые имеют несколько дополнительных свойств [1]:
Функция join
- не что иное, как та операция группирования: тип вложенной монады, такой как m (ma)
, описывает два побочных эффекта и порядок их возникновения, а join
группирует их вместе в один побочный эффект.
Итак, что касается монадических побочных эффектов, операция связывания является сокращением для «принять значение со связанными побочными эффектами и функцию, которая вводит новые побочные эффекты, а затем применить функцию к значению, комбинируя побочные эффекты. для каждого".
[0]: Кроме IO
. IO
очень особенный.
[1]: Если вы сравните эти свойства с правилами для экземпляра Monoid
, вы увидите близкие параллели между ними - это не совпадение, а на самом деле то, что " просто моноид из разряда эндофункторов, в чем проблема? " строка имеет в виду.
Что он делает, концептуально, можно определить, просто посмотрев на тип: он разворачивает или выравнивает внешний монадический контейнер / вычисление и возвращает полученное в нем монадическое значение (я).
Как это происходит на самом деле, определяется тем, с какой монадой вы имеете дело. Например, для монады List 'join' эквивалентен concat .
То, что присоединение делает , было адекватно описано другими ответами до сих пор, я думаю. Если вы ищете более интуитивное понимание ... если вам интересно, что означает "соединение" ... то, к сожалению, ответ будет отличаться в зависимости от рассматриваемой монады, в частности от того, что означает M (X) " «и что означает M (M (X))».
Если M - это монада Список, то M (M (X)) - это список списков, а объединение означает «сплющить». Если M - это монада Maybe, то элементом M (M (X)) может быть «Just (Just x)», «Just Nothing» или «Nothing», и объединение означает разрушение этих структур логическим способом «Just x», «Nothing» и «Nothing» соответственно (аналогично ответу Camccann на объединение, сочетающему побочные эффекты).
Для более сложных монад M (M (X)) становится очень абстрактной вещью, и решение того, что M (M (X)) и соединение «означает», становится более сложным. В любом случае это похоже на случай с монадой List, когда вы объединяете два слоя абстракции монады в один слой, но смысл будет меняться. Для Государственной монады ответ Camccann на объединение двух побочных эффектов - это удар: объединение, по сути, означает объединение двух последовательных переходов состояний. Монада Continuation особенно разрушительна для мозга, но математическое объединение здесь на самом деле довольно аккуратно: M (X) соответствует «двойному двойственному пространству» X, которое математики могли бы записать как X**
(сами продолжения, т.е. карты из X- > R, где R - множество конечных результатов, соответствует единственному двойственному пространству X*
), а join соответствует чрезвычайно естественному отображению из X****
в X**
. Тот факт, что монады продолжения удовлетворяют законам монад, соответствует математическому факту, что, как правило, нет особого смысла применять оператор двойного пространства *
более чем в два раза.
Но я отвлекся.
Лично я пытаюсь сопротивляться желанию применить единственную аналогию ко всем возможным типам монад; Монады - это слишком общее понятие, чтобы их можно было описать одной описательной аналогией. Что означает объединение, будет зависеть от того, с какой аналогией вы работаете в данный момент времени.
Из той же страницы мы извлекаем эту информацию join x = x >>= id
, со знанием того, как работают функции bind
и id
, вы должны быть в состоянии понять, что делает join
.