質問

またこの期 Hindley-ウ, ないと思うのだか把握します。

を読んで以下のポス:

があり、この期間のwikipediaが通常は私の簡潔な説明をします。
注意 -について これによって

何ですか?
どの言語やツールを使用すればいいですか?
出ください。をご用意簡潔に答えなのでしょうか。

役に立ちましたか?

解決

Hindley-ウは タイプシステム 発見された独自のロジャー Hindley者のみロジック)、そしてロビン-ウ者が生成したプログラミング言語).のメリットHindley-ウて

  • にも対応 多型 機能例えば、機能をできるだけリストの長さら独立したタイプの要素や機能は、バイナリー-ツリーのルックアップは独立したタイプのキーに保存されます。

  • 時機能又は価値が 種類以上, どの機能:ることもできます整数のリストを整数型","文字列のリストを整数型","一覧のペアでの整数です。この場合には、信号のHindley-ウシステム 各型の長期独特の"ベスト"タイプ, "といわれる 主体のタイプ.の主体のタイプのリストの長さの機能は"他 a, 機能一覧 a 整数".こちらの a はいわゆる"型のパラメータは、 明示的にラムダ計算暗黙のほとんどのプログラミング言語.の利用の型パラメータを説明Hindley-ウシステムを実装する パラメトリック 多型.(その定義の機能MLの型パラメータこのように:

     fun 'a length []      = 0
       | 'a length (x::xs) = 1 + length xs
    
  • の場合 期間はHindley-Milnerの種類、そして の主体のタイプも推し量ることができずに任意の型の宣言 その他の注釈により、プログラマを交換してください。(これは良い面も悪い面も、誰でも人々をされていましたが取り扱う大きなチャンクのMLコードのないアンソロジー。)

Hindley-Milnerの基礎となタイプシステムであれば、ほとんどの静的入力機能言語です。などの言語に共通利用を含

これらすべての言語の拡張Hindley-ウ;ウ、クリーン、Objective Camlう野心的で珍しい。(拡張子に応じて変更可能な変数から基本Hindley-Milnerできsubvertedを用い、例えば、変更可能な細胞を持つ値のリストの不特定のタイプです。このような問題の処理による拡張子と呼ばれる 値の制限.)

多くの言語やツールを入力言語を使用Hindley-Milner.

Hindley-Milnerの制の システムF, できる種類以上がる 要注釈のプログラマー.

他のヒント

またはお近くの大学の図書館 -

は、Google ScholarのかCiteSeerを使用して、元の論文を見つけることができるかもしれません。最初は、あなたが雑誌のバウンドコピーを見つける必要があり、私はそれをオンラインで見つけることができなかったことを十分に古いです。私はもう一つ見つかりリンクが壊れていたが、他の人があるかもしれません。あなたは確かにこれらを引用する論文を見つけることができるでしょう。

ヒンドリー、ロジャーJ、結合論理内のオブジェクトの主型スキーム アメリカ数学会、1969年の取引ます。

ミルナー、ロビン、のタイプ多型の、コンピュータとシステム科学誌、1978年の理論ます。

簡単なHindley-Milnerの型推論の実装クライアントまで、フルのC#:

Hindley-ウ型推測の基礎理論(Lisp-ish)の"S-表現、下650ラインのC#

注の実施の範囲のみ270いラインのC#のアルゴリズムW正の数のデータ構造を支援するために、とにかく).

利用を抜粋した:

    // ...

    var syntax =
        new SExpressionSyntax().
        Include
        (
            // Not-quite-Lisp-indeed; just tolen from our host, C#, as-is
            SExpressionSyntax.Token("\\/\\/.*", SExpressionSyntax.Commenting),
            SExpressionSyntax.Token("false", (token, match) => false),
            SExpressionSyntax.Token("true", (token, match) => true),
            SExpressionSyntax.Token("null", (token, match) => null),

            // Integers (unsigned)
            SExpressionSyntax.Token("[0-9]+", (token, match) => int.Parse(match)),

            // String literals
            SExpressionSyntax.Token("\\\"(\\\\\\n|\\\\t|\\\\n|\\\\r|\\\\\\\"|[^\\\"])*\\\"", (token, match) => match.Substring(1, match.Length - 2)),

            // For identifiers...
            SExpressionSyntax.Token("[\\$_A-Za-z][\\$_0-9A-Za-z\\-]*", SExpressionSyntax.NewSymbol),

            // ... and such
            SExpressionSyntax.Token("[\\!\\&\\|\\<\\=\\>\\+\\-\\*\\/\\%\\:]+", SExpressionSyntax.NewSymbol)
        );

    var system = TypeSystem.Default;
    var env = new Dictionary<string, IType>();

    // Classic
    var @bool = system.NewType(typeof(bool).Name);
    var @int = system.NewType(typeof(int).Name);
    var @string = system.NewType(typeof(string).Name);

    // Generic list of some `item' type : List<item>
    var ItemType = system.NewGeneric();
    var ListType = system.NewType("List", new[] { ItemType });

    // Populate the top level typing environment (aka, the language's "builtins")
    env[@bool.Id] = @bool;
    env[@int.Id] = @int;
    env[@string.Id] = @string;
    env[ListType.Id] = env["nil"] = ListType;

    //...

    Action<object> analyze =
        (ast) =>
        {
            var nodes = (Node[])visitSExpr(ast);
            foreach (var node in nodes)
            {
                try
                {
                    Console.WriteLine();
                    Console.WriteLine("{0} : {1}", node.Id, system.Infer(env, node));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            Console.WriteLine();
            Console.WriteLine("... Done.");
        };

    // Parse some S-expr (in string representation)
    var source =
        syntax.
        Parse
        (@"
            (
                let
                (
                    // Type inference ""playground""

                    // Classic..                        
                    ( id ( ( x ) => x ) ) // identity

                    ( o ( ( f g ) => ( ( x ) => ( f ( g x ) ) ) ) ) // composition

                    ( factorial ( ( n ) => ( if ( > n 0 ) ( * n ( factorial ( - n 1 ) ) ) 1 ) ) )

                    // More interesting..
                    ( fmap (
                        ( f l ) =>
                        ( if ( empty l )
                            ( : ( f ( head l ) ) ( fmap f ( tail l ) ) )
                            nil
                        )
                    ) )

                    // your own...
                )
                ( )
            )
        ");

    // Visit the parsed S-expr, turn it into a more friendly AST for H-M
    // (see Node, et al, above) and infer some types from the latter
    analyze(source);

    // ...

...る利回り:

id : Function<`u, `u>

o : Function<Function<`z, `aa>, Function<`y, `z>, Function<`y, `aa>>

factorial : Function<Int32, Int32>

fmap : Function<Function<`au, `ax>, List<`au>, List<`ax>>

... Done.

参照 ブライアン-マツケナのJavaScriptを実施 にbitbucket、取得開始(勤務しました。

'HTH,

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top