У монад есть свободные интерфейсы? - PullRequest
9 голосов
/ 26 марта 2011

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

Ответы [ 2 ]

7 голосов
/ 26 марта 2011

Предположительно, вы имеете в виду оператор bind , связанный с монадами, в котором можно начать с монадического значения , связать его с монадической функцией ,и получить еще одно монадическое значение .Это очень похоже на «свободный метод» (или набор таких, составляющих «свободный интерфейс»), который возвращает указатель или ссылку «это», да, но то, что вы упустили бы, это то, что монадическая функциянужно не возвращать монадическое значение того же типа, что и входное значение.Свободное соглашение по методу должно возвращать значение того же типа, чтобы продолжить цепочку вызовов, которые all действительны для готовящегося экземпляра (или экземпляров).

Монадическое bind сигнатура оператора выглядит примерно так:

M[a] -> (a -> M[b]) -> M[b]

То есть «возвращаемое значение» равно , возможно типа, отличного от типа первого входного значения.Это только то же самое, когда предоставленная функция имеет тип

(a -> M[a])

Все зависит от типа монадической функции и, более конкретно, типа возврата монадической функции.

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

1 голос
/ 08 сентября 2013

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

Date date = date()
    .withYear(2008)
    .withMonth(Calendar.JANUARY)
    .withDayOfMonth(15)
    .toDate();

Версия этого кода в Haskell (с использованием воображаемого API даты) может выглядеть следующим образом:

do date
   withYear 2008
   withMonth JANUARY
   withDayOfMonth 15
   toDate

Вопрос о том, квалифицируется ли этот или другие DSL, основанные на нотации, такие как «свободный интерфейс», является предметом обсуждения, поскольку формального определения того, что такое «свободный интерфейс», нет. Я бы сказал, что если это так, то это достаточно близко.

Обратите внимание, что это не совсем характерно для монад; Монады МОГУТ иметь свободный интерфейс, если вам не требуется вызов метода, но это будет зависеть от имен функций и способа использования API.

...