চেকিং এবং পুনরাবৃত্তির প্রকারগুলি টাইপ করুন (হাস্কেল / ওকামেলে ওয়াই সংযুক্তকারী লেখা)


21

হাস্কেলের প্রসঙ্গে ওয়াই কম্বিনেটরটি ব্যাখ্যা করার সময়, এটি সাধারণত লক্ষ্য করা যায় যে সোজা-ফরোয়ার্ড প্রয়োগটি তার পুনরাবৃত্তির ধরণের কারণে হাস্কেলে টাইপ-চেক করবে না।

উদাহরণস্বরূপ, রোসটাকোড থেকে :

The obvious definition of the Y combinator in Haskell canot be used
because it contains an infinite recursive type (a = a -> b). Defining
a data type (Mu) allows this recursion to be broken.

newtype Mu a = Roll { unroll :: Mu a -> a }

fix :: (a -> a) -> a
fix = \f -> (\x -> f (unroll x x)) $ Roll (\x -> f (unroll x x))

এবং প্রকৃতপক্ষে, "সুস্পষ্ট" সংজ্ঞা চেক টাইপ করে না:

λ> let fix f g = (\x -> \a -> f (x x) a) (\x -> \a -> f (x x) a) g

<interactive>:10:33:
    Occurs check: cannot construct the infinite type:
      t2 = t2 -> t0 -> t1
    Expected type: t2 -> t0 -> t1
      Actual type: (t2 -> t0 -> t1) -> t0 -> t1
    In the first argument of `x', namely `x'
    In the first argument of `f', namely `(x x)'
    In the expression: f (x x) a

<interactive>:10:57:
    Occurs check: cannot construct the infinite type:
      t2 = t2 -> t0 -> t1
    In the first argument of `x', namely `x'
    In the first argument of `f', namely `(x x)'
    In the expression: f (x x) a
(0.01 secs, 1033328 bytes)

ওকামলে একই সীমাবদ্ধতা বিদ্যমান:

utop # let fix f g = (fun x a -> f (x x) a) (fun x a -> f (x x) a) g;;
Error: This expression has type 'a -> 'b but an expression was expected of type 'a                                    
       The type variable 'a occurs inside 'a -> 'b

যাইহোক, ওকামালে, কেউ -rectypesস্যুইচটিতে পাস করে পুনরাবৃত্ত প্রকারের অনুমতি দিতে পারে:

   -rectypes
          Allow  arbitrary  recursive  types  during type-checking.  By default, only recursive
          types where the recursion goes through an object type are supported.

ব্যবহার করে -rectypes, সবকিছু কাজ করে:

utop # let fix f g = (fun x a -> f (x x) a) (fun x a -> f (x x) a) g;;
val fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
utop # let fact_improver partial n = if n = 0 then 1 else n*partial (n-1);;
val fact_improver : (int -> int) -> int -> int = <fun>
utop # (fix fact_improver) 5;;
- : int = 120

টাইপ সিস্টেম এবং টাইপ অনুমান সম্পর্কে উত্সাহী হয়ে, এটি কিছু প্রশ্ন উত্থাপন করে যা আমি এখনও উত্তর দিতে পারছি না।

  • প্রথমে, টাইপ চেকার টাইপটি কীভাবে আসে t2 = t2 -> t0 -> t1? এই ধরণের সাথে আসার পরে, আমি অনুমান করি যে সমস্যাটি হ'ল টাইপটি ( t2ডানদিকে) নিজেকে বোঝায়?
  • দ্বিতীয়ত এবং সম্ভবত সবচেয়ে আকর্ষণীয়, হাস্কেল / ওকমল টাইপ সিস্টেমগুলি এটিকে অস্বীকার করার কারণ কী? আমি অনুমান করি যে এর একটি ভাল কারণ আছে যেহেতু ওচামল এটিকে ডিফল্টরূপে অনুমতি দেয় না এমনকি যদি এটি স্যুইচ দেওয়া থাকে তবে পুনরাবৃত্তির ধরণের সাথেও ডিল করতে-rectypes পারে।

এগুলি যদি সত্যিই বড় বিষয় হয় তবে আমি প্রাসঙ্গিক সাহিত্যের পয়েন্টারকে প্রশংসা করব।

উত্তর:


16

প্রথমত, জিএইচসি ত্রুটি,

জিএইচসি কয়েকটি সীমাবদ্ধতাগুলির সাথে একত্রিত করার চেষ্টা করছে x, প্রথমে আমরা এটি একটি ফাংশন হিসাবে ব্যবহার করি

x :: a -> b

পরবর্তী আমরা এটি ফাংশনের মান হিসাবে ব্যবহার করি

x :: a

এবং অবশেষে আমরা এটিকে মূল আর্গুমেন্টের সাথে একীকরণ করি

x :: (a -> b) -> c -> d

এখন x xঐক্যবদ্ধ করার একটি প্রয়াস হয়ে t2 -> t1 -> t0, তবে, আমরা এই ঐক্যসাধন না পারেন, যেহেতু এটি ঐক্যবদ্ধ করতে হবে t2, প্রথম যুক্তি xদিয়ে x। সুতরাং আমাদের ত্রুটি বার্তা।

পরবর্তী, কেন সাধারণ পুনরাবৃত্তির ধরণগুলি নয়। ওয়েল, প্রথম বিষয়টি লক্ষ্য করার মতো বিষয় হ'ল ইকুই এবং আইসো রিকার্সিভ ধরণের মধ্যে পার্থক্য,

  • ইক্যুই-রিকভারসিভগুলি যা আপনি প্রত্যাশা করতেন mu X . Typeতা হ'ল এটিকে বিচ্ছিন্নভাবে ভাঁজ করা বা ভাঁজ করার সমান।
  • আইসো-রিকার্সিভ টাইপগুলি অপারেটরগুলির একটি জুড়ি সরবরাহ করে foldএবং unfoldযা ধরণের পুনরাবৃত্ত সংজ্ঞাগুলি ভাঁজ করে এবং উদ্ঘাটন করে।

এখন ইক্যুসি-রিকভারসিভ প্রকারগুলি আদর্শ মনে হয়, তবে জটিল ধরণের সিস্টেমে সঠিকভাবে পাওয়া কঠিন। এটি আসলে প্রকারের চেকিংকে অনস্বীকার্য করতে পারে। আমি ওসিএএমএল এর টাইপ সিস্টেমের প্রতিটি বিবরণের সাথে পরিচিত নই তবে হাসকেলে সম্পূর্ণরূপে নিখরচায় টাইপগুলি টাইপচেকারকে নির্বিচারে প্রকারকে একত্রিত করার চেষ্টা করতে পারে, ডিফল্টরূপে, হাস্কেল নিশ্চিত করে যে টাইপ চেকিং বন্ধ হয়ে যায়। আরও, হাস্কেলের মধ্যে টাইপ প্রতিশব্দটি বোবা, সবচেয়ে দরকারী পুনরাবৃত্তির type T = T -> ()ধরণগুলি যেমন হ্যাসকেলে প্রায় তাত্ক্ষণিকভাবে ইনলাইন করা হয় তবে এটি অনন্ত! সুতরাং, হাস্কেলের পুনরাবৃত্তির ধরনগুলি প্রতিশব্দগুলি কীভাবে পরিচালনা করা হয় তার একটি বিশাল রক্ষণাবেক্ষণের দাবি করবে, সম্ভবত ভাষা বর্ধন হিসাবেও চেষ্টা করার মতো নয় worth

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

তবে এটি আপনার Muধরণের সাথে কী করছেন তার সাথে খুব মিল । Rollভাঁজ হয়, এবং unrollউদ্ঘাটিত হয়। সুতরাং প্রকৃতপক্ষে, আমাদের কাছে আইসো-রিকার্সিভ টাইপগুলি বেকড রয়েছে However তবে, ইক্যুই-রিকার্সিভ টাইপগুলি খুব জটিল তাই ওসিএএমএল এবং হাস্কেলের মতো সিস্টেমগুলি আপনাকে টাইপ লেভেল ফিক্সপয়েন্টগুলির মাধ্যমে পুনরাবৃত্তিগুলি পাস করতে বাধ্য করে।

এখন যদি এটি আপনার আগ্রহী হয় তবে আমি প্রকার এবং প্রোগ্রামিং ভাষার প্রস্তাব দিই। আমার অনুলিপিটি আমার কোলে খোলা বসে আছে কারণ আমি সঠিক পরিভাষা পেয়েছি তা নিশ্চিত করতে এটি লিখছি :)


বিশেষ অধ্যায়ের 21 অধিবেশন অন্তর্ভুক্তি, সমন্বয় এবং পুনরাবৃত্তির ধরণের জন্য একটি ভাল স্বীকৃতি সরবরাহ করে
ড্যানিয়েল গ্রেটজার

ধন্যবাদ! এটি সত্যিই চিত্তাকর্ষক। আমি বর্তমানে টিএপিএল পড়ছি, এবং এটি শুনে বইটি পরে আচ্ছাদিত হবে শুনে আমি আনন্দিত।
বিটা

@ বেটা ইয়েপ, টিএপিএল এবং এটির বড় ভাই, প্রকারভেদ এবং প্রোগ্রামিং ভাষার উন্নত বিষয়গুলি হ'ল দুর্দান্ত সম্পদ।
ড্যানিয়েল গ্রেটজার

2

ওসিএএমএল, আপনাকে -rectypesসংকলকের কাছে পরামিতি হিসাবে পাস করতে হবে (বা #rectypes;;শীর্ষ স্তরে প্রবেশ করুন)। মোটামুটিভাবে বলতে গেলে, এটি একীকরণের সময় "ঘটে যাওয়া চেক" বন্ধ করবে। পরিস্থিতি The type variable 'a occurs inside 'a -> 'bআর সমস্যা হবে না। টাইপ সিস্টেমটি এখনও "সঠিক" (শব্দ ইত্যাদি) থাকবে, অসীম গাছ যে প্রকার হিসাবে উত্থিত হয় কখনও কখনও তাকে "যুক্তিযুক্ত গাছ" বলা হয়। টাইপ সিস্টেমটি দুর্বল হয়ে যায়, অর্থাত্ কিছু প্রোগ্রামার ত্রুটি সনাক্ত করা অসম্ভব হয়ে পড়ে।

ওক্যামেলের উদাহরণ সহ ফিক্সপয়েন্ট পয়েন্ট অপারেটরদের সম্পর্কে আরও তথ্যের জন্য ল্যাম্বডা-ক্যালকুলাসের আমার বক্তৃতাটি দেখুন (২ sl স্লাইডে শুরু করুন)।

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