সীমাবদ্ধতাগুলি সনাক্ত করার কৌশলসমূহ


322

এখানে দৃশ্যধারণ করা হয়েছে: আমি একটি টাইপ স্বাক্ষর সহ কিছু কোড লিখেছি এবং জিএইচসি অভিযোগ করেছেন যে কিছু xএবং এর জন্য x ~ y কে ছাড় করতে পারেনি y। আপনি সাধারণত জিএইচসিকে একটি হাড় নিক্ষেপ করতে পারেন এবং কেবল ফাংশন সীমাবদ্ধতায় আইসোমরফিজম যুক্ত করতে পারেন তবে বেশ কয়েকটি কারণে এটি একটি খারাপ ধারণা:

  1. এটি কোড বোঝার উপর জোর দেয় না।
  2. আপনি ৫ টি বাধা দিয়ে শেষ করতে পারেন যেখানে একজনের যথেষ্ট হবে (উদাহরণস্বরূপ, যদি ৫ টি আরও একটি নির্দিষ্ট সীমাবদ্ধতার দ্বারা বোঝানো হয়)
  3. আপনি যদি কিছু ভুল করে থাকেন বা জিএইচসি যদি সহায়তা না করে থাকেন তবে আপনি জালিয়াতির সীমাবদ্ধতাগুলি শেষ করতে পারেন

আমি শুধু কয়েক ঘন্টা অতিবাহিত battling ক্ষেত্রে 3. আমি খেলছি syntactic-2.0, এবং আমি একটি ডোমেন স্বাধীন সংস্করণ সংজ্ঞায়িত করার চেষ্টা ছিল share, সংস্করণ সংজ্ঞায়িত অনুরূপ NanoFeldspar.hs

আমার এটি ছিল:

{-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-}
import Data.Syntactic

-- Based on NanoFeldspar.hs
data Let a where
    Let :: Let (a :-> (a -> b) :-> Full b)

share :: (Let :<: sup,
          Domain a ~ sup,
          Domain b ~ sup,
          SyntacticN (a -> (a -> b) -> b) fi) 
      => a -> (a -> b) -> a
share = sugarSym Let

এবং জিএইচসি could not deduce (Internal a) ~ (Internal b), যা অবশ্যই আমি যাচ্ছিলাম তা নয়। সুতরাং হয় আমি কিছু কোড লিখেছিলাম যা আমার উদ্দেশ্য ছিল না (যা সীমাবদ্ধতার প্রয়োজন), বা জিএইচসি আমার সীমাবদ্ধভাবে লিখেছিল এমন কিছু প্রতিবন্ধকতার কারণে সেই সীমাবদ্ধতা চেয়েছিল।

দেখা যাচ্ছে যে আমাকে (Syntactic a, Syntactic b, Syntactic (a->b))বাধা তালিকায় যুক্ত করা দরকার , যার মধ্যে কোনওটিই বোঝাচ্ছে না (Internal a) ~ (Internal b)। আমি মূলত সঠিক বাধা নিয়ে হোঁচট খেয়েছি; তাদের সন্ধান করার মতো পদ্ধতিগত উপায় এখনও আমার কাছে নেই।

আমার প্রশ্নগুলি হ'ল:

  1. জিএইচসি কেন এই সীমাবদ্ধতার প্রস্তাব দিয়েছে? সিনথেটিকের কোথাও কোনও বাধা নেই Internal a ~ Internal b, তাই জিএইচসি কোথা থেকে এটিকে টানল?
  2. সাধারণভাবে, জিএইচসি বিশ্বাস করে যে এটি প্রয়োজন বলে মনে করে এমন একটি প্রতিবন্ধকতার উত্স সনাক্ত করতে কোন কৌশল ব্যবহার করা যেতে পারে? এমনকি আমি নিজেকে আবিষ্কার করতে পারি এমন প্রতিবন্ধকতাগুলির জন্য , আমার পদ্ধতির মূলত শারীরিকভাবে পুনরাবৃত্ত সীমাবদ্ধতাগুলি লিখে আপত্তিকর পথটি জোর করা উচিত। এই পদ্ধতির মূলত প্রতিবন্ধকতাগুলির একটি অসীম খরগোশের গর্ত নিচে চলেছে এবং আমি কল্পনা করতে পারি এমন সবচেয়ে কম দক্ষ পদ্ধতি সম্পর্কে।

21
টাইপ স্তরের ডিবাগার নিয়ে কিছু আলোচনা হয়েছে, তবে সাধারণ sensক্যমত্যটি টাইপচেকারের অভ্যন্তরীণ যুক্তি দেখায় বলে মনে হচ্ছে না: / ঠিক এখনই হাস্কেলের সীমাবদ্ধ সমাধানকারীটি একটি কৃপণ অস্বচ্ছ অস্বচ্ছ যুক্তির ভাষা :)
ড্যানিয়েল গ্রেটজার

12
@jozefg আপনার কি সেই আলোচনার জন্য একটি লিঙ্ক আছে?
crockeea

36
প্রায়শই এটি কেবল প্রকারের স্বাক্ষর সম্পূর্ণরূপে মুছে ফেলতে সহায়তা করে এবং স্বাক্ষরটি কী হওয়া উচিত তা জিএসিসি আপনাকে জানাতে দেয়।
টোবিয়াস ব্র্যান্ড্ট

12
একরকম aএবং bআবদ্ধ - আপনার প্রসঙ্গে বাইরের স্বাক্ষরের প্রকারটি দেখুন - a -> (a -> b) -> aনা a -> (a -> b) -> b। এটা কি তাই? সীমাবদ্ধ সমাধানকারীদের সাথে, তারা যে কোনও জায়গায় ট্রানজিটিভ সাম্যকে প্রভাবিত করতে পারে , তবে ত্রুটিগুলি সাধারণত কোনও অবস্থানকে "কাছাকাছি" দেখায় যেখানে সীমাবদ্ধতা প্ররোচিত হয়েছিল। @ জোজেফগ যদিও এটি দুর্দান্ত হবে - ট্যাগ বা কোনও কিছু দিয়ে সীমাবদ্ধতাগুলি বোধগম্য করে, কোথা থেকে এসেছে তা দেখানোর জন্য? : s
এথান ক্লার্ক

উত্তর:


6

প্রথমত, আপনার ফাংশনটির ভুল ধরণের রয়েছে; আমি অবশ্যই নিশ্চিত যে এটি হওয়া উচিত (প্রসঙ্গ ছাড়াই) a -> (a -> b) -> b। জিএইচসি 7.10 এটি নির্দেশ করতে কিছুটা বেশি সহায়ক, কারণ আপনার আসল কোড সহ এটি একটি অনুপস্থিত বাধা সম্পর্কে অভিযোগ করে Internal (a -> b) ~ (Internal a -> Internal a)shareধরণের ধরণের ঠিক করার পরে , জিএইচসি 7.10 আমাদের গাইড করতে সহায়তা করে:

  1. Could not deduce (Internal (a -> b) ~ (Internal a -> Internal b))

  2. উপরের যোগ করার পরে, আমরা পেতে Could not deduce (sup ~ Domain (a -> b))

  3. যোগ করার পরে, আমরা পেয়েছি Could not deduce (Syntactic a), Could not deduce (Syntactic b)এবংCould not deduce (Syntactic (a -> b))

  4. এই তিনটি যুক্ত করার পরে, এটি শেষ পর্যন্ত টাইপকেচেস; সুতরাং আমরা শেষ পর্যন্ত

    share :: (Let :<: sup,
              Domain a ~ sup,
              Domain b ~ sup,
              Domain (a -> b) ~ sup,
              Internal (a -> b) ~ (Internal a -> Internal b),
              Syntactic a, Syntactic b, Syntactic (a -> b),
              SyntacticN (a -> (a -> b) -> b) fi)
          => a -> (a -> b) -> b
    share = sugarSym Let
    

সুতরাং আমি বলতে পারি যে আমাদের নেতৃত্ব দেওয়ার ক্ষেত্রে জিএইচসি অকেজো নয়।

জিএইচসি যেখানে তার সীমাবদ্ধতা প্রয়োজনীয়তাগুলি পেয়েছে তার সন্ধানের বিষয়ে আপনার প্রশ্ন হিসাবে , আপনি বিশেষত জিএইচসির ডিবাগিং পতাকাগুলি চেষ্টা করতে পারেন -ddump-tc-traceএবং তারপরে ফলাফলটি লগের মাধ্যমে পড়তে পারেন Internal (a -> b) ~ tএবং সেটটিতে (Internal a -> Internal a) ~ tকী যুক্ত করা হয়েছে Wanted, তবে এটি বেশ দীর্ঘ পঠিত হবে ।


0

আপনি কি জিএইচসি 8.8+ তে এটি ব্যবহার করে দেখেছেন?

share :: (Let :<: sup,
          Domain a ~ sup,
          Domain b ~ sup,
          SyntacticN (a -> (a -> b) -> b) fi,
          _) 
      => a -> (a -> b) -> a
share = sugarSym Let

কীটি হ'ল বাধাগুলির মধ্যে টাইপ হোল ব্যবহার করা: _ => your difficult type

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