Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# “什么是”呢;一元反射;?_F# - Fatal编程技术网

F# “什么是”呢;一元反射;?

F# “什么是”呢;一元反射;?,f#,F#,什么是“一元反射” 如何在F#程序中使用它 这里“反射”一词的含义与.NET反射相同吗?我阅读了谷歌的第一个热门文章,一些幻灯片: 从这个看来 这与.NET反射不同。这个名字似乎是指将数据转化为代码(反之亦然,通过具体化) 代码使用标准的纯函数操作,因此在F#中实现应该很容易。(一旦你明白了) 我不知道这对于实现递归函数的不可变缓存是否有用。看起来您可以定义可变操作并自动将其转换为等效的不可变操作?我不太懂幻灯片 奥列格·基塞柳夫也读过,但我甚至没有读过。还有一篇来自(等人)的论文。答案5是这

什么是“一元反射”

如何在F#程序中使用它


这里“反射”一词的含义与.NET反射相同吗?

我阅读了谷歌的第一个热门文章,一些幻灯片:

从这个看来

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

  • 奥列格·基塞柳夫也读过,但我甚至没有读过。还有一篇来自(等人)的论文。答案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)