13

コミュニティ Wiki の質問:

この質問に従って: .Net で Scala を使用する利点は何ですか? 別の質問が思い浮かびます。.Net プラットフォームでの機能開発におけるNemerleと F#の利点 (および欠点) を比較して説明できる人はいますか? ついでにネメルルを見たところだ。F# と同じ球場でプレーしているように聞こえるので、明らかな構文の違いと、F# が Microsoft に支援されているという大きな利点以外に、どのような違いがあるのか​​ 疑問に思っていました。

4

2 に答える 2

20

私はこれらの言語の両方に触れましたが、Nemerle についての印象は簡単に次のとおりです。

  • F# コミュニティはかなり大きく、多数のブログ投稿、記事などにより常に成長しています。また、国全体に広がっています。反対に、Nemerle 愛好家は基本的にロシア語を話し、RSDN.ruサイトに集中しています。
  • Nemerle 構文は、C に似た言語のバックグラウンドを持つ開発者にとって、IMO よりもはるかに使いやすいです。
  • Nemerle (および F#) には型推論機能があります。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 

ネメルレ

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# ソースなどの構文解析の機能など、ほとんどの言語制御構造はマクロを使用して作成されます。マクロ アプリケーションのサンプルの 1 つがここにありますところで、上記のサンプルの$構文を使用した文字列フォーマット機能も組み込みマクロです。

編集:少し大きいサンプルを追加

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");
    }
}
于 2010-08-27T22:18:44.587 に答える
4

私は Nemerle についてほとんど知りませんが、その大きな特徴の 1 つはマクロだと思います (見苦しい C のようなマクロとは対照的に、衛生的な Scheme のような幸せなマクロです)。なぜ人々がマクロをそんなに好きなのか、よく理解できませんでしたが、F# を使い始めるまで、なぜ人々が代数的データ型とパターン マッチングを好むのか、まったく理解できませんでした。したがって、マクロが好きで .NET を使用しているのであれば、Nemerle の熱狂的なファンではないでしょうか。

于 2010-08-27T21:56:54.560 に答える