F# “什么是”呢;一元反射;?
什么是“一元反射” 如何在F#程序中使用它F# “什么是”呢;一元反射;?,f#,F#,什么是“一元反射” 如何在F#程序中使用它 这里“反射”一词的含义与.NET反射相同吗?我阅读了谷歌的第一个热门文章,一些幻灯片: 从这个看来 这与.NET反射不同。这个名字似乎是指将数据转化为代码(反之亦然,通过具体化) 代码使用标准的纯函数操作,因此在F#中实现应该很容易。(一旦你明白了) 我不知道这对于实现递归函数的不可变缓存是否有用。看起来您可以定义可变操作并自动将其转换为等效的不可变操作?我不太懂幻灯片 奥列格·基塞柳夫也读过,但我甚至没有读过。还有一篇来自(等人)的论文。答案5是这
这里“反射”一词的含义与.NET反射相同吗?我阅读了谷歌的第一个热门文章,一些幻灯片: 从这个看来
奥列格·基塞柳夫也读过,但我甚至没有读过。还有一篇来自(等人)的论文。答案5是这个问题,所以我不再考虑这个问题。单子反射本质上是一种描述分层单子或单子分层的语法。在Haskell中,描述也意味着构造单子。这是一个更高层次的系统,因此代码看起来像是功能性的,但结果是单子组成的——这意味着没有实际的单子(非功能性的)就没有真正的/可运行的。菲林斯基这样做最初是为了给Scheme带来一种单子模拟,但更多的是为了探索单子的理论方面 注释中的更正-F#有一个名为 -没有代码,但有很多理论,当然还有他1994年的原始论文-。加上一个有代码的:(1995)
哦,对于喜欢代码的人来说,它是在线的。我将只列出一个步骤,然后再看另一个7和自述。正如前面的答案链接所描述的,声称受到菲林斯基启发的也是一个概念。为了更详细地描述这两个概念: (=monad)是使用自定义生成器类型创建的 唐·赛姆有个好主意。如果我编写代码使用生成器并使用以下语法:
attempt { let! n1 = f inp1
let! n2 = failIfBig inp2
let sum = n1 + n2
return sum }
语法转换为程序样式:
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可用于Church类型的编程,其中组合函数用于构造任何其他函数(或程序): 是一种用纯函数表示数字的方法
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,所以一=零|>plusOne
要执行这些函数,最后一个函数将调用最后一个参数(x)为null的其他函数
(哈斯克尔式编程。)
在F#值限制中,这很难实现。(内部使用.NET反射)。我认为在F#中也有解决办法。我想为递归F#函数实现一个不可变(“只读”)缓存。我简单地看了一下关于“一元反射”的幻灯片,但看起来这个主题肯定需要更多的时间!如果有人能给出一个简短的解释,那就太棒了。我想.NET反射是另一回事。关于不可变缓存-缓存函数调用的常用技术是记忆。但它使用一个可变的内部字典。我想你可以通过使用某种状态单子使它变得“纯粹”,但这可能不是你的问题……事实上,我发现的小F#代码(见链接)声称是无状态单子回忆录代码。如果你有勇气尝试的话,请告诉我们:-)我建议你在索贝尔的论文之前阅读约翰·C·米切尔的《编程语言基础》一书的前两章。。。你说单子不起作用是什么意思?
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)