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

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

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

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

Ответы

Ответ 1

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

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

Filinski paper на POPL 2010 - нет кода, но много теории, и, конечно, его оригинальная статья с 1994 года - Представление Monads. Плюс один, у которого есть код: Monad Transformers и Modular Interpreters (1995)

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

Ответ 2

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

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

Из этого он выглядит как

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

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

Ответ 3

Как видно из предыдущих ответов, Монадическое отражение является концепцией bridge стиль call/cc и программирование стиля церкви. Чтобы описать эти два понятия еще несколько:

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

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

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

синтаксис переводится в call/cc "call-with-current-продолжение" в стиле:

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 используется для функции комбинации в других вычислениях (например, add). Функция succ похожа на plusOne, поэтому one = zero | > plusOne.

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

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

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