কেন ঘিসি দেশুগার তালিকা টাইপ করে পরিবারগুলি? এটি কি নির্বাচন করে অক্ষম করা যায়?


93

আমি আমার লাইব্রেরিগুলির জন্য টাইপ করা টাইপগুলি ghci প্রদর্শন করার জন্য যতটা সম্ভব স্বজ্ঞাত চেষ্টা করার চেষ্টা করছি, তবে আরও উন্নত প্রকারের বৈশিষ্ট্যগুলি ব্যবহার করার সময় আমি অনেক অসুবিধায় পড়েছি।

ধরা যাক আমার একটি ফাইলটিতে এই কোড রয়েছে:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

import GHC.TypeLits

data Container (xs::[*]) = Container

আমি এটিকে ghci এ লোড করি, তারপরে আমি নিম্নলিখিত কমান্ডটি টাইপ করি:

ghci> :t undefined :: Container '[String,String,String,String,String]

দুর্ভাগ্যক্রমে, gci আমাকে বরং কুৎসিত চেহারা দেয়:

:: Container
       ((':)
          *
          String
          ((':)
             * String ((':) * String ((':) * String ((':) * String ('[] *))))))

টাইপ স্তরের স্ট্রিংগুলির জন্য চিনি অপসারণ করেছে gh Gci কে এটি করতে বাধা দেওয়ার কোনও উপায় আছে এবং আমাকে কেবল সুন্দর সংস্করণ দিচ্ছেন?


সম্পর্কিত নোটে, বলি আমি একটি টাইপ স্তর Replicateফাংশন তৈরি করি

data Nat1 = Zero | Succ Nat1

type family Replicate (n::Nat1) x :: [*]
type instance Replicate Zero x = '[]
type instance Replicate (Succ n) x = x ': (Replicate n x)

type LotsOfStrings = Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String

এখন, যখন আমি ব্যবহার করে টাইপ জিজ্ঞাসা করি LotsOfStrings:

ghci> :t undefined :: Container LotsOfStrings

ghci সুন্দর এবং আমাকে সুন্দর ফলাফল দেয়:

undefined :: Container LotsOfStrings

তবে আমি যদি Replicateডি সংস্করণ চাই,

ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)

টাইপ প্রতিশব্দ জন্য যখন এটি না করে তখন টাইপ পরিবারের জন্য জিসিসি বিকল্প করে:

:: Container
       ((':)
          *
          [Char]
          ((':)
             * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))

কেন টাইপ পরিবারের জন্য বিকল্পটি প্রতিস্থাপন করছেন, কিন্তু টাইপ প্রতিশব্দ নয়? Ghষি বিকল্প কখন করবে তা নিয়ন্ত্রণ করার কোনও উপায় আছে?


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

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

4
@ অ্যান্ড্রুসি আমি আপনার মন্তব্যের সাথে সম্পর্কিত আরও একটি প্রশ্ন ভাবলাম: স্ট্রিংসের প্রকারগুলি মাঝে মধ্যে প্রদর্শিত হয় [Char]এবং কখনও কখনও প্রদর্শিত হয় Stringকেন?
মাইক ইজবিকি

4
আমি মনে করি যে উত্সে এটি খুঁজে পাওয়া টাইপ প্রতিশব্দ সংরক্ষণ করার চেষ্টা করে ci অর্থাৎ যদি একটি ফাংশন ঘোষণা ধরনের হতে String->String, তারপর তার ফলাফলের ধরণ হিসেবে প্রদর্শিত হবে String। তবে যদি এটি টুকরোগুলি থেকে কোনও প্রকার তৈরি করতে হয়, যেমন "abc"(যেমনটি একই 'a':'b':'c':[]) সংরক্ষণের কোনও প্রতিশব্দ নেই। এটি খাঁটি জল্পনা।
এন। 'সর্বনাম' মি।

4
@ এনএম: নোট করুন যে GHC টাইপ ভেরিয়েবলের নাম সংরক্ষণের জন্য একই রকম চেষ্টা করে থাকে, যখন আরও জেনেরিক ইনফেরার্ড প্রকারগুলি কম জেনেরিক, স্পষ্টত নামযুক্ত ধরণের ভেরিয়েবলগুলির সাথে একত্রিত হয়। আমি সন্দেহ যে যদি স্পষ্ট টাইপ Stringটাইপ ভেরিয়েবল সঙ্গে একীভূত করা হয় f aবা [a], এটা হিসেবে প্রদর্শিত হবে [Char]একই কারণে পরে।
সিএ ম্যাকক্যান

উত্তর:


2

আমি যে ওয়ার্কারআউন্ডটি জানি তা ব্যবহার করছে: দয়ালু। এই ক্ষেত্রে,

ghci>: ধরনের (ধারক) [স্ট্রিং, স্ট্রিং, স্ট্রিং, স্ট্রিং, স্ট্রিং])

দেয়:

(ধারক '[স্ট্রিং, স্ট্রিং, স্ট্রিং, স্ট্রিং, স্ট্রিং]) :: *

যখন

ghci>: দয়ালু! (ধারক '[স্ট্রিং, স্ট্রিং, স্ট্রিং, স্ট্রিং, স্ট্রিং])

এরকম কিছু মুদ্রণ করবে:

ধারক

((':)

  *
  [Char]
  ((':)
     * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))

আনুষ্ঠানিকভাবে, অবশ্যই আপনি জিটিসি সাথে একটি আলাদা প্রশ্ন জিজ্ঞাসা করছেন kind, তবে এটি কার্যকর হয়। ব্যবহার undefined ::করা যেকোন উপায়ে সাজানো, তাই আমি ভেবেছিলাম এটি যথেষ্ট।


আমি কেবল undefined ::একটি সহজ উদাহরণ দিতে ব্যবহার করছিলাম । আসল সমস্যাটি হ'ল যখন আপনি একটি ত্রুটি বার্তা পান যাতে এক হাজার বিভিন্ন প্রকারের তালিকার একটি ধরণের রয়েছে। এটি মুদ্রণ করতে পৃষ্ঠাগুলি নেয় এবং পার্স করা খুব কঠিন।
মাইক ইজবিকি

হ্যাঁ, যথেষ্ট ন্যায্য। কানা সেটা বুঝতে পেরেছিল। আমি আপনাকে আরও ভাল উত্তর
দেই

2

এটি আসন্ন জিএইচসি 7.8 এ স্থির করা হয়েছে।

যদি কোনও ডেটাটাইপ পলিকিন্ড ব্যবহার করে তবে জিএইচসি 7.6 প্রিন্ট করে। সুতরাং আপনি ন্যায়বিচারের (':) * String ('[] *)পরিবর্তে দেখুন (':) String '[]

জিএইচসি 8.৮-তে, ধরণের আর ডিফল্টরূপে প্রদর্শিত হয় না এবং আপনার ডাটাটাইপটি তালিকা হিসাবে সুন্দরভাবে মুদ্রিত হয়, যেমনটি আপনি প্রত্যাশা করতেন। আপনি -fprint-explicit-kindsজিএইচসি 7.6 এর মতো সুস্পষ্ট প্রকারগুলি দেখতে নতুন পতাকাটি ব্যবহার করতে পারেন । আমি এর কারণগুলি জানি না, সম্ভবত স্পষ্টত ধরণের জিনিসগুলি পলকিন্ডগুলি বোঝার জন্য সহায়তা হিসাবে বোঝানো হয়েছিল।


0
import GHC.TypeLits

data Container (xs::[*]) = Container

আমি এটিকে ghci এ লোড করি, তারপরে আমি নিম্নলিখিত কমান্ডটি টাইপ করি:

:t undefined :: Container '[String,String,String,String,String]

তো ...? আমার মনে হয় আপনি এখনও ফলাফল ফিরে পেয়েছেন, যেমন String ((':) * String ((':) * String ((':) * ...
বাম দিকের বাইরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.