Как описано в предыдущих ответах на ссылки, Монадическое отражение - это концепция 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 #.