Функция соединения монады

Из HTTPoison README:

Обычно hackney открывает и закрывает соединения по требованию , но также создает пул по умолчанию соединений, которые повторно используются для запросов к одному и тому же хосту. Если соединение и хост поддерживают keepalive, соединение остается открытым до тех пор, пока оно не будет явно закрыто.

blockquote>

HTTPoison не экспортирует close для базового сокета, и с 2017 года существует открытый выпуск для этого.

Между тем, вы можете позвонить hackney_pool:stop_pool(:default). Это, очевидно, не оптимальное решение в любом случае, и оно имеет огромные накладные расходы. Поэтому я бы посоветовал либо отправить запрос на включение HTTPoison, включив функцию закрытия соединения (через делегирование ;hackney_response.close/1 ) или , просто избавиться от избыточности HTTPoison и просто используйте hackney.

26
задан kiamlaluno 5 December 2011 в 00:44
поделиться

4 ответа

На самом деле, в некотором смысле, join - это то место, где действительно происходит вся магия - (>> =) используется в основном для удобства.

Все классы типов на основе Functor описывают дополнительную структуру с помощью некоторого типа. В Functor эта дополнительная структура часто рассматривается как «контейнер», в то время как в Monad она обычно рассматривается как «побочные эффекты», но они всего лишь (иногда вводящие в заблуждение) сокращенные - в любом случае это одно и то же, и на самом деле ничего особенного [0].

Отличительной особенностью Монады по сравнению с другими Функторами является то, что он может встраивать поток управления в дополнительную структуру. Причина, по которой он может это сделать, заключается в том, что, в отличие от fmap , который применяет одну плоскую функцию ко всей структуре, (>> =) проверяет отдельные элементы и строит новые ] структура из этого.

С простым функтором построение новой структуры из каждой части исходной структуры вместо этого вложило бы Functor , причем каждый уровень представлял бы точку потока управления. Это, очевидно, ограничивает полезность, так как результат беспорядочный и имеет тип, который отражает структуру используемого управления потоком.

Монадические «побочные эффекты» - это структуры, которые имеют несколько дополнительных свойств [1]:

  • Два побочных эффекта могут быть сгруппированы в один (например, «сделать X» и «сделать Y» превратиться в «сделать X, затем Y». "), и порядок группировки не имеет значения, пока сохраняется порядок эффектов.
  • Существует побочный эффект «ничего не делать» (например, сгруппированные «делать X» и «ничего не делать» - это то же самое, что и просто «делать X»).

Функция join - не что иное, как та операция группирования: тип вложенной монады, такой как m (ma) , описывает два побочных эффекта и порядок их возникновения, а join группирует их вместе в один побочный эффект.

Итак, что касается монадических побочных эффектов, операция связывания является сокращением для «принять значение со связанными побочными эффектами и функцию, которая вводит новые побочные эффекты, а затем применить функцию к значению, комбинируя побочные эффекты. для каждого".

[0]: Кроме IO . IO очень особенный.

[1]: Если вы сравните эти свойства с правилами для экземпляра Monoid , вы увидите близкие параллели между ними - это не совпадение, а на самом деле то, что " просто моноид из разряда эндофункторов, в чем проблема? " строка имеет в виду.

41
ответ дан 28 November 2019 в 06:15
поделиться

Что он делает, концептуально, можно определить, просто посмотрев на тип: он разворачивает или выравнивает внешний монадический контейнер / вычисление и возвращает полученное в нем монадическое значение (я).

Как это происходит на самом деле, определяется тем, с какой монадой вы имеете дело. Например, для монады List 'join' эквивалентен concat .

5
ответ дан Daniel Pratt 28 November 2019 в 06:15
поделиться

То, что присоединение делает , было адекватно описано другими ответами до сих пор, я думаю. Если вы ищете более интуитивное понимание ... если вам интересно, что означает "соединение" ... то, к сожалению, ответ будет отличаться в зависимости от рассматриваемой монады, в частности от того, что означает 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**. Тот факт, что монады продолжения удовлетворяют законам монад, соответствует математическому факту, что, как правило, нет особого смысла применять оператор двойного пространства * более чем в два раза.

Но я отвлекся.

Лично я пытаюсь сопротивляться желанию применить единственную аналогию ко всем возможным типам монад; Монады - это слишком общее понятие, чтобы их можно было описать одной описательной аналогией. Что означает объединение, будет зависеть от того, с какой аналогией вы работаете в данный момент времени.

27
ответ дан Peter Milley 28 November 2019 в 06:15
поделиться

Из той же страницы мы извлекаем эту информацию join x = x >>= id, со знанием того, как работают функции bind и id, вы должны быть в состоянии понять, что делает join.

8
ответ дан 28 November 2019 в 06:15
поделиться
Другие вопросы по тегам:

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