gpt4 book ai didi

.net - Nemerle 和 F# 在 .Net 上的功能比较

转载 作者:行者123 更新时间:2023-12-03 23:23:56 25 4
gpt4 key购买 nike

社区维基问题:

根据这个问题:What are the benefits of using Scala in .Net?另一个问题浮现在脑海。谁能列出 Nemerle 的比较优势(和劣势)?和 F# 用于 .Net 平台上的功能开发?我只是顺便看了看Nemerle。听起来它与 F# 在同一个球场上发挥作用,所以我想知道除了明显的语法差异和 F# 得到微软支持的巨大优势之外,还有什么不同。

最佳答案

我接触过这两种语言,我对 Nemerle 的印象简要如下:(我假设大多数观众都熟悉 F#,而 Nemerle 不太受欢迎,所以为了公平起见,我会多介绍一下):

  • F# 社区相当大,并且由于大量的博客文章、文章等而不断增长。它也分布在各个国家/地区。恰恰相反,Nemerle 爱好者基本都是讲俄语的,并且专注于 RSDN.ru。地点。
  • 对于具有类 C 语言背景的开发人员来说,Nemerle 语法对 IMO 更加友好。
  • Nemerle(以及 F#)具有类型推断功能。 Nemerle 中的类型推断机制与方法体(局部函数、变量等)绑定(bind),与 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

    内梅尔
    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#
    let addInt = (+) 5
    let addString = (+) "!!!"

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

    run addInt 5
    run addString "S"

    Nemerle 在相同条件下会推断出 的类型运行作为 (int->int) * int -> int。

    有关 Nemerle 类型推理机制的更多详细信息,请参阅 Michal Moskal 的硕士论文: Type Inference With Deferral
  • Nemerle 具有丰富的元编程能力。大多数语言控制结构,如循环、条件表达式、LINQ 支持、即将推出的解析功能包括 C# 源等等——所有这些都是使用宏创建的。可以找到一个宏应用程序示例 here .顺便说一句, 的字符串格式化功能$ 上面示例中的语法 - 也是内置宏。

  • 编辑:添加了稍大的样本
    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");
    }
    }

    关于.net - Nemerle 和 F# 在 .Net 上的功能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3588179/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com