Подтвердить что ты не робот

Что вы называете данными, обернутыми внутри монады?

В речи и письме я все время хочу ссылаться на данные внутри монады, но я не знаю, как это назвать.

Например, в Scala аргумент функции, переданной в flatMap, привязан к... er... этой вещи внутри монады. В:

List(1, 2, 3).flatMap(x => List(x, x))

x привязывается к этой вещи, для которой у меня нет слова.

Усложняя вещи немного, аргумент, передаваемый стрелке Клейсли, необязательно связан со всеми данными внутри монады. С List, Set, Stream и множеством других монадов flatMap многократно вызывает стрелку Kleisli, привязывая x к другой части данных внутри монады каждый раз. Или, может быть, даже не "данные", если соблюдаются законы монады. Что бы это ни было, оно завернуто внутри монады, и flatMap передает его вам без обертки, возможно, по одной части за раз. Я просто хочу знать, как назвать соответствующий материал внутри-монады, к которому относится x, по крайней мере частично, поэтому я могу остановить весь этот неуклюжий язык.

Существует ли стандартный или обычный термин для этой вещи/данных/значения/материала/чего-то еще?

Если нет, как насчет "конфеты"?

4b9b3361

Ответ 1

Попытка сказать, что "x привязана к", настраивает вас на отказ. Позвольте мне объяснить и направлять вас к лучшему способу выражения себя, когда вы говорите об этих вещах.

Предположим, что:

someList.flatMap(x => some_expression)

Если мы знаем, что someList имеет тип List[Int], то можно с уверенностью сказать, что внутри some_expression, x привязано к значению типа Int. Обратите внимание на оговорку, внутри some_expression ". Это связано с тем, что, учитывая someList = List(1,2,3), x будет принимать значения каждого из них: 1, 2 и 3, в свою очередь.

Рассмотрим более обобщенный пример:

someMonadicValue.flatMap(x => some_expression)

Если мы ничего не знаем о someMonadicValue, мы мало знаем о том, как будет вызываться some_expression. Он может запускаться один или три раза (как в приведенном выше примере), либо лениво, либо асинхронно, либо он может быть запланирован для завершения работы someMonadicValue (например, фьючерсы) или никогда не может использоваться (например, пустой список, None). Интерфейс Monad не включает в себя рассуждения о том, когда и как будет использоваться someExpression. Итак, все, что вы можете сказать о том, что будет x, будет ограничено контекстом some_expression, всякий раз, когда и как бы some_expression не оценивалось.

Итак, вернемся к примеру.

someMonadicValue.flatMap(x => some_expression)

Вы пытаетесь сказать: "x - это номер someMonadicValue." И вы ищете слово, которое точно заменяет???. Хорошо, я здесь, чтобы сказать вам, что вы делаете это неправильно. Если вы хотите говорить о x, то либо сделайте это

  • В контексте some_expression. В этом случае используйте выделенную мной полуживую фразу: "внутри some_expression, x привязано к значению типа Foo". Или, альтернативно, вы можете говорить о x...
  • С дополнительными знаниями о том, с какой монадой вы имеете дело.

В случае # 2, например, для someList.flatMap(x => some_expression), вы можете сказать, что "x - это каждый элемент someList". Для someFuture.flatMap(x => some_expression) можно сказать, что "x - это успешное будущее значение someFuture, если оно действительно когда-либо завершается и преуспевает".

Вы видите, что красота Монад. Что??? которую вы пытаетесь описать, - это то, что интерфейс Monad абстрагируется над. Теперь вы видите, почему так сложно дать??? имя? Это потому, что у него другое имя и другое значение для каждой конкретной монады. И то, что имеет смысл абстракции Монады: объединить эти разные понятия под одним и тем же вычислительным интерфейсом.

Ответ 2

Отказ от ответственности: я определенно не специалист по терминологии функционального программирования, и я ожидаю, что следующее не будет ответом на ваш вопрос с вашей точки зрения. Для меня проблема скорее заключается в следующем: если выбор термина требует экспертных знаний, то и понимание.

Выбор подходящего термина во многом зависит от:

  • ваш желаемый уровень языковой корректности и
  • ваша аудитория и соответствующие коннотации определенных терминов.

Что касается лингвистической корректности, вопрос заключается в том, правильно ли вы хотите ссылаться на значения/данные, привязанные к x, или вы можете жить с определенной (неправильной) абстракцией. Что касается аудитории, я бы в основном различал аудиторию с солидным фоном в функциональном программировании и аудиторией, исходящей из других парадигм программирования. В случае первого выбора этот термин, вероятно, не имеет решающего значения, поскольку сама концепция знакома, и многие термины приведут к правильной ассоциации. Обсуждение в комментариях уже содержит некоторые очень хорошие предложения по этому делу. Тем не менее, обсуждение также показывает, что вам нужен определенный фон в функциональном программировании, чтобы увидеть обоснование некоторых терминов.

Для аудитории, не имеющей фона в функциональном программировании, я предпочел бы пожертвовать лингвистической корректностью в пользу понятности. В такой ситуации я часто называю ее "базовым типом", чтобы избежать путаницы, которую я, вероятно, создавал бы, пытаясь сослаться на "вещь (и) в самой монаде". Очевидно, что буквально неправильно сказать: "x привязан к базовому типу". Однако для меня важнее, что моя аудитория понимает концепцию вообще. Поскольку большинство программистов знакомы с контейнерами и их базовыми типами, я нацелен на (ошибочную) ассоциацию "базовый тип" = > "вещь (-и), которая находится в контейнере" = > "вещь (-и) внутри монады", которая часто работает.

TL; DR: Всегда существует компромисс между правильностью и доступностью. И когда дело доходит до функционального программирования, иногда полезно сдвинуть смещение к последнему.

Ответ 3

flatMap многократно не вызывает стрелку Kleisli. И "эта вещь" не "внутри" монады.

flatMap поднимает стрелу Клейсли к монаде. Вы могли видеть это как построение стрелки M[A] => M[B] между типами (A, B), поднятыми до монады (M[A], M[B]), с учетом стрелки Клейсли A => M[B].

Итак, x в x => f(x) - это значение, которое поднимается.

Ответ 4

Какие данные?

data Monady a = Monady

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

То, о чем вы хотите поговорить, - это продолжения типа Monad m => a -> m b, поскольку они гарантированно существуют. Смешной материал происходит в том, как (>>=) использует эти продолжения.

Ответ 5

"Элемент" кажется хорошим? "Параметр параметра, если вам нужно быть более конкретным.

Либо исходные данные могут содержать несколько элементов, либо операция может вызывать его несколько раз. Элемент будет иметь тенденцию быть более конкретным для первого случая, значение является единственным в отношении источника и не имеет смысла для использования списков, но Item правильно охватывает все случаи.

Отказ от ответственности: я знаю больше о понятном английском, чем о FP.

Ответ 6

Сделайте шаг назад.

Монада - это не только функтор m, который обертывает значение a. Монада представляет собой стек эндофунторов (т.е. Составы m) вместе с оператором join. Что там, где знаменитая шутка - что монада является моноидом в категории эндофунторов, какая проблема? - происходит от.

(Вся история состоит в том, что quip означает, что состав m является другим m, о чем свидетельствует join)

Вещь с типом (m a) обычно называется действием монады. Вы можете вызвать a результат действия.