Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
.net Net上函数的Nemerle和F#的比较_.net_F#_Functional Programming_Nemerle - Fatal编程技术网

.net Net上函数的Nemerle和F#的比较

.net Net上函数的Nemerle和F#的比较,.net,f#,functional-programming,nemerle,.net,F#,Functional Programming,Nemerle,社区维基问题: 根据这个问题:我想到了另一个问题。有人能在.Net平台上展示和F#在功能开发方面的相对优势(和劣势)吗?我只是顺便看看内默尔。听起来它和F#有点类似,所以我想知道除了明显的语法差异和F#得到微软支持的巨大优势之外,还有什么不同之处。我对Nemerle知之甚少,但我认为它的一大特点是宏(与丑陋的C形宏相反,类似于快乐宏的一种保健方案).我从来没有想过为什么人们如此喜欢宏,但我也从来没有想过为什么人们如此喜欢代数数据类型和模式匹配,直到我开始使用F#。所以我怀疑如果你喜欢宏,并且使用

社区维基问题:


根据这个问题:我想到了另一个问题。有人能在.Net平台上展示和F#在功能开发方面的相对优势(和劣势)吗?我只是顺便看看内默尔。听起来它和F#有点类似,所以我想知道除了明显的语法差异和F#得到微软支持的巨大优势之外,还有什么不同之处。

我对Nemerle知之甚少,但我认为它的一大特点是宏(与丑陋的C形宏相反,类似于快乐宏的一种保健方案).我从来没有想过为什么人们如此喜欢宏,但我也从来没有想过为什么人们如此喜欢代数数据类型和模式匹配,直到我开始使用F#。所以我怀疑如果你喜欢宏,并且使用.NET,那么你就是Nemerle的狂热粉丝。

我接触过这两种语言,我对Nemerle的印象是briefly:(我假设大多数观众都熟悉F#,而Nemerle则不那么受欢迎,因此为了公平起见,我将对其进行更多的报道):

  • F#社区规模相当大,由于大量的博客、文章等,它不断增长。此外,它还遍布各个国家。相反,Nemerle爱好者基本上讲俄语,并专注于网站
  • Nemerle语法对于具有类似C语言背景的开发人员来说更加友好
  • Nemerle(以及F#)具有类型推理功能。Nemerle中的类型推理机制绑定到方法体(局部函数、变量等),与F#全局类型推理作用域相反。然而,Nemerle编译器没有强制执行任何特定的编写代码习惯来辅助类型推理机制
F#

内默尔

using System.Console; 
using System.Collections.Generic; 
using System.Text; 

def l = [1,2,3]; 
def res = l.FoldLeft(StringBuilder(), (v, acc) => acc.Append(v).AppendLine()); 
WriteLine($"Result:\n$res"); 

def d = Dictionary(); // generic parameters are absent (even placeholders!!!) 
d.Add(1, "!"); 
WriteLine(d.GetType()); // System.Collections.Generic.Dictionary`2[System.Int32,System.String] 
此外,您可能会注意到Nemerle编译器的另一个功能–它可以从进一步的使用中推断类型。要推断类型,F#使用基于Hindley-Milner算法的方法,并尝试推断最泛型的类型。相反,Nemerle从不推断多态类型,总是寻找最特定的类型

F#

在相同条件下,Nemerle将运行的类型推断为(int->int)*int->int

有关Nemerle类型推断机制的更多详细信息,请参阅Michal Moskal的MSc论文:

  • Nemerle拥有丰富的元编程功能。大多数语言控制结构,如循环、条件表达式、LINQ支持、即将推出的解析功能,包括C#源和更多–所有这些都是使用宏创建的。可以找到一个宏应用程序示例。顺便说一句,字符串格式化功能具有$
编辑:添加了稍大的样本

using System.Console;
using System.Collections.Generic;
using System.Text;

variant Expr
{
  | Const { value : double }
  | Var { name : string }
  | Operation { id : string; left : Expr; right : Expr }

  public Eval(operations : Dictionary[string, double*double -> double], context : Dictionary[string, double]) : double
  {
    match(this)
    {
        | Const (value) => value
        | Var(name) => context[name]
        | Operation(id, left, right) => 
            def f = operations[id];
            f(left.Eval(operations, context), right.Eval(operations, context))
    }
  }
}

module Program
{
    public Main() : void
    {
        def expr = 
            Expr.Operation(
                "*",
                Expr.Const(10),
                Expr.Operation(
                "+",
                Expr.Var("n"),
                Expr.Const(5)
                )
            );
        def operations = Dictionary.[string, double * double -> double]();
        operations["+"] = (x, y) => x + y;
        operations["*"] = _ * _;

        def vars = Dictionary();
        vars["n"] = 3.0;

        def result = expr.Eval(operations, vars);
        WriteLine($"Result is $result");
    }
}

嗯,模式匹配。我想知道像happy宏这样的scheme有多好吃。现在我必须在周末尝试Nermerle。Nemerle宏基本上是编译器扩展。它们用于实现大多数语言结构,包括“if”语句和“for”循环、Linq支持,以及用于日志记录、分析、AOP等的各种有用库。“我从来没有完全弄明白为什么人们如此喜欢宏。”如果你知道F#,试试OCaml的宏(camlp4)。“我从来没有完全弄明白为什么人们如此喜欢宏“。我发现了Nemerle,因为我想知道我是否可以在F#中使用宏,所以也许我最终可以停止
OnPropertyChanged
的疯狂和混乱,它如何用UI可见类过滤每个文件。我太厌倦了。我将拭目以待,看看这种代码重复的未来会如何。”。
let addInt = (+) 5
let addString = (+) "!!!"

let run f x = f (f x) // ('T -> 'T) -> 'T -> 'T

run addInt 5
run addString "S"
using System.Console;
using System.Collections.Generic;
using System.Text;

variant Expr
{
  | Const { value : double }
  | Var { name : string }
  | Operation { id : string; left : Expr; right : Expr }

  public Eval(operations : Dictionary[string, double*double -> double], context : Dictionary[string, double]) : double
  {
    match(this)
    {
        | Const (value) => value
        | Var(name) => context[name]
        | Operation(id, left, right) => 
            def f = operations[id];
            f(left.Eval(operations, context), right.Eval(operations, context))
    }
  }
}

module Program
{
    public Main() : void
    {
        def expr = 
            Expr.Operation(
                "*",
                Expr.Const(10),
                Expr.Operation(
                "+",
                Expr.Var("n"),
                Expr.Const(5)
                )
            );
        def operations = Dictionary.[string, double * double -> double]();
        operations["+"] = (x, y) => x + y;
        operations["*"] = _ * _;

        def vars = Dictionary();
        vars["n"] = 3.0;

        def result = expr.Eval(operations, vars);
        WriteLine($"Result is $result");
    }
}