হিন্ডলি-মিলনার কী?


124

আমি এই শব্দটির মুখোমুখি হয়েছি হিন্দি-মিলনার এবং এর অর্থ কী তা বুঝতে পেরে আমি নিশ্চিত নই।

আমি নিম্নলিখিত পোস্টগুলি পড়েছি:

তবে উইকিপিডিয়ায় এই পদটির জন্য কোনও একক প্রবেশ নেই যা সাধারণত আমাকে একটি সংক্ষিপ্ত ব্যাখ্যা দেয়।
দ্রষ্টব্য - একটি এখন যুক্ত করা হয়েছে

এটা কি?
কোন ভাষা এবং সরঞ্জামগুলি এটি প্রয়োগ করে বা ব্যবহার করে?
আপনি দয়া করে একটি সংক্ষিপ্ত উত্তর দিতে হবে?

উত্তর:


167

হিন্ডলি-মিলনার হ'ল এক ধরণের সিস্টেম যা স্বাধীনভাবে রজার হিন্ডি (যিনি যুক্তি দেখছিলেন) এবং পরবর্তীতে রবিন মিলনার (যিনি প্রোগ্রামিং ভাষার দিকে তাকিয়ে ছিলেন) দ্বারা আবিষ্কার করেছিলেন। হিন্ডলি-মিলনার সুবিধা হ'ল

  • এটি পলিমারফিক ফাংশন সমর্থন করে; উদাহরণস্বরূপ, এমন একটি ফাংশন যা আপনাকে তালিকার দৈর্ঘ্য উপাদানগুলির ধরণের থেকে পৃথক করতে পারে বা কোনও ফাংশন বাইনারি-ট্রি অনুসন্ধান করে গাছের মধ্যে থাকা কীগুলির ধরণের থেকে আলাদা।

  • কখনও কখনও কোনও ফাংশন বা মানের একাধিক প্রকার থাকতে পারে যেমন দৈর্ঘ্যের ফাংশনের উদাহরণ: এটি "পূর্ণসংখ্যার সাথে পূর্ণসংখ্যার তালিকা", "পূর্ণসংখ্যার স্ট্রিংগুলির তালিকা", "পূর্ণসংখ্যার জোড়গুলির তালিকা" হতে পারে এবং তাই চালু. এই ক্ষেত্রে, হিন্ডি-মিলনার সিস্টেমের একটি সিগন্যাল সুবিধা হ'ল প্রতিটি ভাল-টাইপযুক্ত শব্দটির একটি অনন্য "সেরা" টাইপ থাকে , যাকে মূল প্রকার বলা হয় । তালিকার দৈর্ঘ্যের ক্রিয়াকলাপের প্রধান প্রকারটি হ'ল " যেকোনোটির জন্য, পূর্ণসংখ্যার aতালিকা থেকে ফাংশন a"। এখানে aএকটি তথাকথিত "টাইপ প্যারামিটার" রয়েছে যা ল্যাম্বদা ক্যালকুলাসে সুস্পষ্ট তবে বেশিরভাগ প্রোগ্রামিং ভাষায়প্যারামেট্রিক পলিমারফিজম । (আপনি যদি এমএলে দৈর্ঘ্যের ফাংশনের একটি সংজ্ঞা লিখে থাকেন তবে আপনি টাইপ প্যারামিটারটি দেখতে পাবেন:

     fun 'a length []      = 0
       | 'a length (x::xs) = 1 + length xs
    
  • যদি কোনও পদটিতে হিন্ডি-মিলনার প্রকার থাকে, তবে প্রোগ্রামার দ্বারা কোনও প্রকারের ঘোষণাপত্র বা অন্যান্য টীকাগুলির প্রয়োজন ছাড়াই মূল প্রকারটি অনুমান করা যায়। (এটি একটি মিশ্র আশীর্বাদ, যেহেতু যে কেউ প্রমাণ করতে পারে যে কখনও কোনও মন্তব্য ছাড়াই এমএল কোডের একটি বিশাল অংশ পরিচালনা করা হয়েছে hand)

হ্যান্ডলি-মিলনার হ'ল প্রায় প্রতিটি স্ট্যাটিক্যালি টাইপড ফাংশনাল ভাষার টাইপ সিস্টেমের ভিত্তি। সাধারণ ব্যবহারে এ জাতীয় ভাষা অন্তর্ভুক্ত

এই সমস্ত ভাষা হিন্দি-মিলনার প্রসারিত করেছে; হাস্কেল, ক্লিন এবং অবজেক্টিভ ক্যামেল উচ্চাকাঙ্ক্ষী এবং অস্বাভাবিক উপায়ে এটি করেন। (এক্সটেনশন,, চপল ভেরিয়েবল সঙ্গে মোকাবিলা করার জন্য প্রয়োজন হয় যেহেতু মৌলিক Hindley-মিলনার ব্যবহার subverted যাবে উদাহরণস্বরূপ, অনির্দিষ্ট ধরনের মূল্যবোধের একটি তালিকা অধিষ্ঠিত। এই ধরনের সমস্যার একটি চপল সেল একটি এক্সটেনশন নামক দ্বারা মোকাবেলা করছে মান সীমাবদ্ধতা ))

টাইপড ফাংশনাল ভাষার উপর ভিত্তি করে অন্যান্য অনেক ছোট ছোট ভাষা এবং সরঞ্জামগুলি হিন্ডলি-মিলনার ব্যবহার করে।

হিন্ডি-মিলনার সিস্টেম এফ -এর একটি বিধিনিষেধ , যা আরও বেশি প্রকারের অনুমতি দেয় তবে প্রোগ্রামার দ্বারা এনেটেশন প্রয়োজন


2
@ নরম্যান রামসে আমি জানি এটি দুষ্ট পুরাতন তবে যা আমাকে অবিরাম বিরক্ত করেছে তা পরিষ্কার করার জন্য ধন্যবাদ: আমি যখনই হিন্দি-মিলনার টাইপ সিস্টেমের সাথে কথা বলতে চাইছি তখনই এইচএম একটি ধরণের কিনা তা নিয়ে আমি প্রশ্ন শুরু করেছি সিস্টেম বা কেবল ইনফারেন্স অ্যালগরিদম ... থানকিয়া আপনি এই বিষয়ে লোককে ভুল তথ্য দেওয়ার জন্য উইকিপিডিয়াতে অনুমান করেছিলেন যে তারা আমাকে এমনকি বিভ্রান্ত করেছে ..
জিমি হোফা

1
কেন এটি প্যারামেট্রিকভাবে পলিমারফিক, কেবল পলিমারফিকের বিপরীতে? আপনার দেওয়া যে কোনওটির উদাহরণ, আমি এটিকে উদাহরণ হিসাবে দেখি যদি পলিমারফিজম - যেখানে সুপারটাইপের পরিবর্তে সাবটাইপগুলি ব্যবহার করা যেতে পারে যা সংজ্ঞায় নির্দিষ্ট করা হয়, এবং প্যারামেট্রিক পলিমারফিজম আলা সি ++ নয় যেখানে প্রকৃত প্রকারটি তৈরি করার জন্য প্রোগ্রামার দ্বারা নির্দিষ্ট করা হয় নতুন ফাংশন
কোরাজা

1
@ জ্যাকোরা: কয়েক বছর দেরীতে হলেও ভবিষ্যতের পাঠকদের সুবিধার জন্য: এটি প্যারামিট্রিকের সম্পত্তি হিসাবে প্যারামেট্রিক পলিমারফিজম বলে , যার অর্থ আপনি যে কোনও ধরণের প্লাগইন করেন তার মতো ফাংশনটির সমস্ত উদাহরণ length :: forall a. [a] -> Intঅবশ্যই এর মতোই আচরণ করা উচিত a—আইটি অস্বচ্ছ; আপনি এটি সম্পর্কে কিছুই জানেন না। instanceofআপনি অতিরিক্ত ধরণের সীমাবদ্ধতা (হাস্কেল টাইপক্ল্যাশস) যোগ না করলে নেই (জাভা জেনেরিকস) বা "হাঁসের টাইপিং" (সি ++ টেম্পলেট) নেই। প্যারামিট্রিকটির সাহায্যে কোনও ফাংশন কী করতে পারে / কী করতে পারে না সে সম্পর্কে আপনি কিছু দুর্দান্ত প্রমাণ পেতে পারেন।
জন

8

আপনি গুগল স্কলার বা সিটিসিয়ার - বা আপনার স্থানীয় বিশ্ববিদ্যালয়ের গ্রন্থাগার ব্যবহার করে মূল কাগজপত্রগুলি সন্ধান করতে পারবেন। প্রথমটি যথেষ্ট পুরনো যে আপনাকে জার্নালের আবদ্ধ অনুলিপিগুলি খুঁজে পেতে হতে পারে, আমি এটি অনলাইনে খুঁজে পাইনি। অন্যটির জন্য যে লিঙ্কটি আমি পেয়েছি তা নষ্ট হয়ে গেছে, তবে অন্যগুলিও থাকতে পারে। আপনি অবশ্যই কাগজপত্রগুলি সন্ধান করতে সক্ষম হবেন যা এগুলি উদ্ধৃত করে।

হিন্ডলি, রজার জে, সংযুক্ত যুক্তিতে কোনও বস্তুর মূল প্রকারের স্কিম আমেরিকান ম্যাথমেটিকাল সোসাইটির লেনদেন, ১৯69৯।

মিলনার, রবিন, টাইপ পলিমারফিজম , কম্পিউটার এবং সিস্টেম সায়েন্সেস জার্নাল, 1978 A


2
পরেরটি এখানে পাওয়া যাবে: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.67.5276
ম্যাগনাস


6

সি # তে সিম্পল হিন্ডলি-মিলনার ধরণের অনুমিতকরণ প্রয়োগ:

সি # এর 650 লাইনের নীচে হিন্ডলি-মিলনার ধরণের ইনফারেন্স (লিস্প-ইশ) এস-এক্সপ্রেশনগুলি

লক্ষ করুন যে বাস্তবায়নটি কেবল # 27 এর লাইনগুলির মধ্যে রয়েছে (আলগোরিদম ডাব্লু যথাযথ এবং এটি সমর্থন করার জন্য কয়েকটি ডেটা স্ট্রাকচারের জন্য)।

ব্যবহারের অংশ:

    // ...

    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.

আরও দেখুন ব্রায়ান McKenna এর জাভাস্ক্রিপ্ট বাস্তবায়ন bitbucket উপর, যা শুরু করতে সাহায্য করে (আমার জন্য কাজ)।

'আছে HTH,

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.