什么是“monadic reflection”?

问题描述:

什么是“monadic reflection”?什么是“monadic reflection”?

我该如何在F#中使用它?

术语“反射”的含义是否与.NET-reflection相同?

+0

我想为递归f#函数实现一个不可变(“只读”)缓存。 – 2010-02-22 13:09:45

+1

我简单地看了一下关于“monadic reflection”的幻灯片,但看起来话题肯定需要更多时间!如果有人能够给出关于它是什么的简单解释,那就太棒了。我想.NET反射是一个不同的事情。 – 2010-02-23 02:57:09

+2

关于不可变缓存 - 缓存函数调用的常用技术是_memoization_。但是它使用了一个可变的内部字典。我想你可以通过使用某种国家monad来使它成为“纯粹的”,但这可能不是你的问题...... – 2010-02-23 02:59:10

我从第一款谷歌命中阅读,一些幻灯片:

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

由此看来,它看起来像

  1. 这是不一样的.NET反射。这个名字似乎是指将数据转化为代码(反之亦然,具体化)。
  2. 该代码使用标准的纯功能操作,因此F#中的实现应该很容易。 (一旦你明白了)
  3. 我不知道这是否对于实现递归函数的不可变缓存有用。它看起来像你可以定义可变操作并将它们自动转换为等价的不可变操作?我不太了解幻灯片。

奥列格Kiselyov也有an article,但我甚至没有尝试读取它。还有一篇来自Jonathan Sobel(等)的论文。命中5号是这个问题,所以我停止了这个问题。

+0

我推荐在Sobel的论文之前阅读John C. Mitchell的“编程语言的基础”两本书的第一章。 – ssp 2010-08-03 14:54:54

一元反射本质上是描述分层monad或monad分层的语法。在Haskell描述中也意味着构建单子。这是一个更高级别的系统,所以代码看起来像是功能性的,但结果是monad组合 - 意味着如果没有真正的monad(非功能性),那么在一天结束时就没有真正的/可运行的。 Filinski最初是为了尝试为Scheme提供一种单子模拟,但更多的是探索单子的理论方面。从注释

修正 - F#有一个单子相当于命名为"Computation Expressions"

Filinski's paper at POPL 2010 - 没有代码,但有很多的理论,当然还有他的原始论文从1994年 - Representing Monads。另外一个有一些代码:Monad Transformers and Modular Interpreters(1995)

哦,对于喜欢代码的人 - Filinski's code是联机的。我只列出一个 - 往前走一步,看另一个7和自述文件。也只是a bit of F# code哪些声称受到灵感来自Filinski

+1

F#有monads ... http://en.wikibooks.org/wiki/F_Sharp_Programming/Computation_Expressions – 2010-08-03 20:54:50

+1

你是什么意思Monads是非功能性的? – TheIronKnuckle 2011-12-06 11:18:29

正如以前的答案链接描述,Monadic reflection是一个概念bridge call/cc style and Church style programming。多描述这两个概念:

F# Computation expressions(= monads)是使用自定义Builder类型创建的。

Don Syme有一个不错的blog post about this。如果我写的代码使用生成器,并使用类似语法:

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

语法转换为call/cc "call-with-current-continuation"样式的程序:

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))) 

Church numerals与纯函数来表示数字的方法。

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 = 0 | plusOne。

要执行这些函数,最后一个函数会将最后一个参数(x)的其他函数调用为null。

(哈斯克尔式编程。)

在F#中值的限制使得这一努力。 Church numerals can be made with C# 4.0 dynamic keyword(其中使用.NET反射)。我认为在F#中也有这样的解决方法。