Что такое "монадическое отражение"? - PullRequest
14 голосов
/ 22 февраля 2010

Что такое "монадическое отражение"?

Как я могу использовать его в F # -программе?

Является ли значение термина "отражение" там так же, как .NET-отражение?

Ответы [ 3 ]

8 голосов
/ 03 августа 2010

Монадическое отражение - это, по сути, грамматика для описания слоистых монад или наложения монад. В Хаскеле описание также означает построение монад. Это система более высокого уровня, поэтому код выглядит как функциональный, но в результате получается монадная композиция. Это означает, что без реальных монад (которые не работают) нет ничего реального / работоспособного в конце дня. Первоначально Филински делал это, пытаясь привнести в Схему своего рода эмуляцию монад, но гораздо больше, чтобы исследовать теоретические аспекты монад.

Исправление из комментария - F # имеет эквивалент монады с именем "Вычислительные выражения"

Статья Филински на POPL 2010 - без кода, но много теории, и, конечно, его оригинальная статья 1994 года - Представление монад . Плюс тот, у которого есть код: Монадные трансформаторы и модульные переводчики (1995)

Да, и для людей, которым нравится код - Код Филински онлайн. Я перечислю только один - поднимитесь на один шаг вверх, посмотрите еще 7 и прочитайте. Также немного кода F # , который, как утверждают, вдохновлен Филински

3 голосов
/ 22 февраля 2010

Я прочитал первый хит Google, некоторые слайды:

http://www.cs.ioc.ee/mpc-amast06/msfp/filinski-slides.pdf

Отсюда это выглядит как

  1. Это не то же самое, что отражение .NET. Название, по-видимому, относится к превращению данных в код (и наоборот, с преобразованием).
  2. Код использует стандартные чисто функциональные операции, поэтому реализация должна быть легкой в ​​F #. (как только вы это поймете)
  3. Я понятия не имею, будет ли это полезно для реализации неизменяемого кэша для рекурсивной функции. Похоже, вы можете определять изменяемые операции и автоматически преобразовывать их в эквивалентные неизменяемые операции? Я не очень понимаю слайды.

У Олега Киселева тоже есть статья , но я даже не пытался ее прочитать. Есть также бумага от Джонатана Собеля (и др.). Хит № 5 - это вопрос, поэтому я перестал присматривать за этим.

1 голос
/ 26 апреля 2012

Как описано в предыдущих ответах на ссылки, Монадическое отражение - это концепция Bridge Call / CC Style и программирования в церковном стиле . Чтобы описать эти два понятия еще немного:

F # Вычислительные выражения (= монады) создаются с пользовательским типом Builder.

У Дона Сайма есть хорошее сообщение в блоге об этом . Если я напишу код для использования конструктора и использовать синтаксис, такой как:

attempt { let! n1 = f inp1
          let! n2 = failIfBig inp2 
          let sum = n1 + n2
          return sum }

синтаксис переводится в call / cc "вызов с текущим продолжением" программа в стиле:

attempt.Delay(fun () ->
  attempt.Bind(f inp1,(fun n1 ->
    attempt.Bind(f inp2,(fun n2 ->
      attempt.Let(n1 + n2,(fun sum ->
        attempt.Return(sum))))))))

Последний параметр - следующая команда, которая должна быть выполнена до конца.

(программирование в стиле схемы).


F # основан на OCaml.

F # имеет частичное применение функции, но также строго типизировано и имеет ограничение по значению.
Но у OCaml нет ограничения по стоимости.

OCaml может использоваться в церковном программировании, где комбинаторные функции используются для конструирования любых других функций (или программ):

// S K I combinators:
let I x = x
let K x y = x
let S x y z = x z (y z)

//examples:
let seven = S (K) (K) 7
let doubleI = I I //Won't work in F#
// y-combinator to make recursion 
let Y = S (K (S I I)) (S (S (K S) K) (K (S I I)))

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

let zero f x = x
//same as: let zero = fun f -> fun x -> x
let succ n f x = f (n f x)
let one = succ zero
let two = succ (succ zero)
let add n1 n2 f x = n1 f (n2 f x)
let multiply n1 n2 f = n2(n1(f))
let exp n1 n2 = n2(n1)

Здесь ноль - это функция, которая принимает две функции в качестве параметров: f применяется ноль раз, так что это представляет число ноль, а x используется для объединения функций в других вычислениях (например, сложение). Функция succ похожа на plusOne, поэтому one = zero |> plusOne.

Для выполнения функций последняя функция будет вызывать другие функции с последним параметром (x), равным нулю.

(программирование в стиле Haskell.)

В F # ограничение по значимости усложняет задачу. Церковные цифры можно создать с помощью динамического ключевого слова C # 4.0 (внутри которого используется отражение .NET). Я думаю, что есть обходные пути, чтобы сделать это также в F #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...