Ono*_*cci 13 .net f# functional-programming nemerle
社区维基问题:
根据这个问题:在.Net中使用Scala有什么好处?另一个问题浮现在脑海中.任何人都可以在.Net平台上列出Nemerle和F#的功能开发的比较优势(和劣势)吗?我刚刚看过Nemerle.听起来它和F#在同一个场地玩得很好,所以我想知道除了显而易见的语法差异和F#支持微软的巨大优势之外还有什么区别.
des*_*sco 20
我已触及这两种语言,我对Nemerle的印象简要如下:(我认为大多数观众都熟悉F#而Nemerle不太受欢迎,所以为了公平起见,我会更多地介绍一下):
F#
open System.Text
let l = [1; 2; 3]
let r1 = l |> List.fold(fun (sb : StringBuilder) v -> sb.Append(v).AppendLine()) (StringBuilder()) // type annotation is required on the function argument
let r2 = (StringBuilder(), l) ||> List.fold(fun sb v -> sb.Append(v).AppendLine()) //here compiler can infer type of State parameter
Run Code Online (Sandbox Code Playgroud)
Nemerle
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]
Run Code Online (Sandbox Code Playgroud)
您还可能注意到Nemerle编译器的另一个功能 - 它可以从进一步的使用中推断出类型.推导类型F#使用基于Hindley-Milner算法的方法,并尝试推断出最通用的类型.相反,Nemerle从不推断多态类型,总是寻找最具体的类型.
F#
let addInt = (+) 5
let addString = (+) "!!!"
let run f x = f (f x) // ('T -> 'T) -> 'T -> 'T
run addInt 5
run addString "S"
Run Code Online (Sandbox Code Playgroud)
在相同条件下的Nemerle将推断运行类型为(int-> int)*int - > int.
关于Nemerle类型推理机制的更多细节可以在Michal Moskal的MSc论文中找到:推断类型推断
编辑:添加稍大的样本
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");
}
}
Run Code Online (Sandbox Code Playgroud)
我对 Nemerle 知之甚少,但我认为它的一大特点是宏(一个卫生的类似计划的快乐宏,而不是丑陋的类似 C 的宏)。我从来没有真正理解为什么人们如此喜欢宏,但话又说回来,我从来没有真正理解为什么人们如此喜欢代数数据类型和模式匹配,直到我开始使用 F#。所以我怀疑,如果您喜欢宏并且使用 .NET,那么您就是 Nemerle 的狂热粉丝。