টেম্পলেট হাস্কেল সম্পর্কে এত খারাপ কী?


252

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

আমি বিভিন্ন ব্লগ পোস্ট দেখেছি যেখানে লোকেরা টেমপ্লেট হাস্কেলের সাথে খুব সুন্দর পরিষ্কার স্টাফ করে, প্রিন্টিয়ার সিনট্যাক্স সক্ষম করে যা নিয়মিত হাস্কেলের পক্ষে সম্ভব হয় না পাশাপাশি অসাধারণ বয়লারপাট হ্রাসও সম্ভব হয়। তাহলে এটি কেন টেম্পলেট হাস্কেলকে এইভাবে তলব করা হয়? এটি কী অনাকাঙ্ক্ষিত করে? কোন পরিস্থিতিতে টেমপ্লেট হাস্কেলকে এড়ানো উচিত এবং কেন?


56
আমি সরানোর জন্য ভোটের সাথে একমত নই; আমি এই প্রশ্নটি একই আত্মায় জিজ্ঞাসা করছি যে আমি জিজ্ঞাসা করেছি অলস I / O সম্পর্কে কী খারাপ? এবং আমি একই ফ্যাশন এর উত্তর দেখতে আশা করি। আমি যদি প্রশ্নটির পুনরায় রেকর্ডিং করতে প্রস্তুত তবে তা যদি সহায়তা করে।
ড্যান বার্টন

51
@ এরিক ফিলিপস আপনি কেন এই ট্যাগটির ঘন ঘন লোকদের সিদ্ধান্ত নিতে দেন না যে এটি এখানে রয়েছে? দেখে মনে হচ্ছে হাস্কেল সম্প্রদায়ের সাথে আপনার একমাত্র কথোপকথনই এর প্রশ্নগুলি রাখবে।
গ্যাব্রিয়েল গঞ্জালেজ

5
@ গ্যাব্রিয়েলগনজালেজ বর্তমান প্রশ্ন এবং উত্তর দিয়ে এটি সুস্পষ্ট যে আমি এখানে কোন ধরণের প্রশ্ন জিজ্ঞাসা করা উচিত তা FAQ অনুসরণ করে না : সমাধান করার মতো কোনও আসল সমস্যা নেই । প্রশ্নের কোনও কোড নির্দিষ্ট সমস্যা সমাধান করা নেই এবং এটি কেবল প্রকৃতির ধারণামূলক। এবং প্রশ্নের ভিত্তিতে আমি টেম্পলেট হ্যাশেল এড়ানো উচিত, এটি স্ট্যাক ওভারফ্লোতে পড়ে কোনও সুপারিশ ইঞ্জিন নয়
এরিক ফিলিপস

27
@ এরিক ফিলিপস সুপারিশ ইঞ্জিনের দিকটি এই প্রশ্নের সাথে অপ্রাসঙ্গিক, কারণ আপনি লক্ষ্য করবেন যে এগুলি বিভিন্ন সরঞ্জামের মধ্যে সিদ্ধান্তের কথা উল্লেখ করছে (যেমন "আমাকে কোন ভাষাটি ব্যবহার করা উচিত তা বলুন")। বিপরীতে, আমি কেবল টেমপ্লেট হাস্কেল সম্পর্কিত বিশেষভাবে ব্যাখ্যা জিজ্ঞাসা করছি এবং এফএকিউতে বলা হয়েছে "যদি আপনার অনুপ্রেরণা“ আমি চাই অন্যরা আমার কাছে [ফাঁকা] "ব্যাখ্যা করেন তবে আপনি সম্ভবত ঠিক আছেন" " উদাহরণস্বরূপ, গোটো এখনও ক্ষতিকারক হিসাবে বিবেচিত?
ড্যান বার্টন

29
পুনরায় খুলতে ভোট। এটি একটি উচ্চ স্তরের প্রশ্ন, কারণ এটি কোনও ভাল নয় doesn't
গিরিগিরিস আন্দ্রেসেক

উত্তর:


171

টেমপ্লেট হাস্কেলকে এড়িয়ে যাওয়ার এক কারণ হ'ল এটি পুরোপুরি টাইপ-নিরাপদ নয়, এইভাবে "হাস্কেলের আত্মা" -র বিপরীতে চলে। এখানে এর কয়েকটি উদাহরণ দেওয়া হল:

  • টিএস কোডের একটি টুকরা কী ধরণের হাস্কেল এএসটি তৈরি করবে তার উপর আপনার কোনও নিয়ন্ত্রণ নেই, যেখানে এটি প্রদর্শিত হবে তার বাইরেও; আপনার টাইপের একটি মান থাকতে পারে Expতবে আপনি জানেন না যে এটি এমন একটি অভিব্যক্তি যা কোনও [Char]বা একটি (a -> (forall b . b -> c))বা যা কিছু উপস্থাপন করে। এটি আরও নির্ভরযোগ্য হবে যদি কেউ প্রকাশ করতে পারে যে কোনও ফাংশন কেবলমাত্র একটি নির্দিষ্ট ধরণের এক্সপ্রেশন তৈরি করতে পারে, বা কেবল ফাংশন ঘোষণাপত্রগুলি, বা কেবল ডেটা-কনস্ট্রাক্টর-ম্যাচিং প্যাটার্নস ইত্যাদি etc.
  • আপনি এমন সংজ্ঞা তৈরি করতে পারেন যা সংকলন করে না। আপনি একটি অভিব্যক্তি তৈরি করেছেন যা একটি মুক্ত ভেরিয়েবলের উল্লেখ fooকরে যা বিদ্যমান নেই? দুর্ভাগ্যক্রমে, আপনি কেবল তখনই দেখতে পাবেন যে যখন আপনার কোড জেনারেটরটি ব্যবহার করছেন এবং কেবলমাত্র সেই পরিস্থিতিতে যা নির্দিষ্ট কোডটির প্রজন্মকে ট্রিগার করে। ইউনিট পরীক্ষা করাও খুব কঠিন।

এটি একেবারে বিপজ্জনক:

  • সংকলন সময়ে চালিত কোড IOমিসাইল প্রবর্তন বা আপনার ক্রেডিট কার্ড চুরি সহ স্বতন্ত্রভাবে কাজ করতে পারে । আপনি কখনই এইচ টি এক্সপ্লিটের সন্ধানে ডাউনলোড করেন এমন প্রতিটি ক্যাবল প্যাকেজটি সন্ধান করতে চান না।
  • টিএইচ "মডিউল-বেসরকারী" ফাংশন এবং সংজ্ঞা অ্যাক্সেস করতে পারে, কিছু ক্ষেত্রে সম্পূর্ণভাবে এনক্যাপসুলেশন ভেঙে দেয়।

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

  • টিএইচ কোড সর্বদা কমপোজ্য হয় না। ধরা যাক যে কেউ লেন্সের জন্য একটি জেনারেটর তৈরি করে এবং প্রায়শই না হয়, সেই জেনারেটরটি এমনভাবে কাঠামোযুক্ত করা হবে যে এটি কেবলমাত্র "শেষ ব্যবহারকারী" দ্বারা কল করা যেতে পারে, অন্য কোনও টিএইচ কোড দ্বারা নয়, উদাহরণস্বরূপ গ্রহণের মাধ্যমে পরামিতি হিসাবে লেন্স তৈরি করতে টাইপ কনস্ট্রাক্টরগুলির একটি তালিকা। কোডটিতে সেই তালিকাটি তৈরি করা মুশকিল, যখন ব্যবহারকারীকে কেবল লিখতে হয় generateLenses [''Foo, ''Bar]
  • বিকাশকারীরা এমনকি জানেন না যে টিএইচ কোড তৈরি করা যেতে পারে। আপনি কি জানেন যে আপনি লিখতে পারেন forM_ [''Foo, ''Bar] generateLens? Qএটি কেবল একটি মোনাড, সুতরাং আপনি এটিতে সমস্ত সাধারণ ক্রিয়াকলাপ ব্যবহার করতে পারেন। কিছু লোক এটি জানেন না এবং এর কারণে তারা মূলত একই কার্যকারিতা সহ একই ফাংশনের একাধিক ওভারলোডেড সংস্করণ তৈরি করে এবং এই ফাংশনগুলি একটি নির্দিষ্ট ফোলা প্রভাবের দিকে নিয়ে যায়। এছাড়াও, বেশিরভাগ লোকেরা তাদের জেনারেটরগুলি Qমোনাডে লেখেন না এমন সময় এমনকি লেখেন bla :: IO Int; bla = return 3; আপনি কোনও ফাংশনটির প্রয়োজনের চেয়ে আরও বেশি "পরিবেশ" দিচ্ছেন, এবং ফাংশনের ক্লায়েন্টদের সেই পরিবেশের জন্য তার পরিবেশনা সরবরাহ করা প্রয়োজন।

শেষ অবধি, এমন কিছু জিনিস রয়েছে যা শেষ ব্যবহারকারী হিসাবে ব্যবহার করতে টিএইচ ফাংশনটিকে কম মজা দেয়:

  • অস্বচ্ছতার অভিযোগ। যখন কোনও TH ফাংশন টাইপ করে Q Dec, এটি মডিউলের শীর্ষ স্তরের একেবারে কিছু উত্পন্ন করতে পারে এবং কী উত্পন্ন হবে তার উপর আপনার একেবারেই কোনও নিয়ন্ত্রণ নেই।
  • Monolithism। বিকাশকারী এটির অনুমতি না দিলে কোনও টিএইচ ফাংশন কতটি উত্পন্ন করে তা আপনি নিয়ন্ত্রণ করতে পারবেন না; যদি আপনি এমন একটি ফাংশন খুঁজে পান যা একটি ডাটাবেস ইন্টারফেস এবং একটি জেএসওএন সিরিয়ালাইজেশন ইন্টারফেস উত্পন্ন করে , আপনি বলতে পারবেন না "না, আমি কেবল ডাটাবেস ইন্টারফেস চাই, ধন্যবাদ; আমি নিজের জেএসএন ইন্টারফেসটি রোল করব"
  • রান সময়। টিএইচ কোডটি চালাতে তুলনামূলকভাবে দীর্ঘ সময় নেয়। প্রতিবার একটি ফাইল সংকলিত হওয়ার সাথে সাথে কোডটি নতুনভাবে ব্যাখ্যা করা হয় এবং প্রায়শই চলমান টিএইচ কোড দ্বারা একটি টন প্যাকেজ প্রয়োজন হয়, যা লোড করতে হয়। এটি কমপাইল সময়কে যথেষ্ট গতি দেয়।

4
এটিকে যুক্ত করুন যে টেম্পলেট-হাস্কেল historতিহাসিকভাবে খুব খারাপভাবে নথিভুক্ত হয়েছে। (যদিও আমি কেবল আবার তাকিয়েছি এবং দেখে মনে হচ্ছে যে জিনিসগুলি এখন কমপক্ষে প্রান্তিকভাবে ভাল। এই দুটি বিষয় আমার উদ্দেশ্যমূলকভাবে অবদান রেখেছে যখন আমি যখন হ্যাস্কেল শিক্ষানবিশ ছিল তখন টিএইচটিকে বোঝার জন্য বিরক্ত করছিলাম না।
শক্তিশালী

14
ভুলে যাবেন না যে টেম্পলেট হাস্কেল ব্যবহারের অর্থ সুস্পষ্টভাবে ঘোষণার ক্রমগুলি বোঝায়! হ্যাশেল এর মসৃণ পোলিশ (এটি 1.4, '98, 2010 বা এমনকি গ্লাসগো হতে পারে) হিসাবে কেউ আশা করতে পারে ঠিক ততটা দৃ integrated়ভাবে সংহত করা হয়নি।
টমাস এম ডুবুইসন

13
আপনি খুব অসুবিধা ছাড়াই হাস্কেল সম্পর্কে যুক্তি করতে পারেন, টেম্পলেট হাস্কেল সম্পর্কে এরকম কোনও গ্যারান্টি নেই।
অগাস্টস

15
এবং ওলেগের টিএইচ-এর একটি টাইপ-নিরাপদ বিকল্পের প্রতিশ্রুতির কী হয়েছিল? আমি তার "অবশেষে ট্যাগহীন, আংশিকভাবে মূল্যায়ন" কাগজ এবং তার আরও নোটগুলি এখানে ভিত্তি করে তার কাজের উল্লেখ করছি । যখন তারা এটি ঘোষণা করেছিল তখন এটি এত প্রতিশ্রুতিবদ্ধ লাগছিল এবং এরপরে আমি আর কোনও শব্দ শুনিনি heard
গ্যাব্রিয়েল গঞ্জালেজ


53

এটি কেবল আমার নিজস্ব মতামত।

  • এটি ব্যবহার করা কুৎসিত। $(fooBar ''Asdf)শুধু সুন্দর দেখাচ্ছে না। অতিমাত্রায়, নিশ্চিত, তবে এটি অবদান রাখে।

  • এটি লিখতে এমনকি খারাপ। উদ্ধৃতি কখনও কখনও কাজ করে তবে অনেক সময় আপনাকে ম্যানুয়াল এএসটি গ্রাফটিং এবং নদীর গভীরতানির্ণয় করতে হয়। এপিআই , বড় এবং জবরজং হয় সবসময় মামলা আপনি যত্ন সম্পর্কে না কিন্তু এখনও প্রেরণ করতে হবে অনেক কিছু আছে, এবং মামলা আপনি যত্ন না সম্পর্কে একাধিক অনুরূপ কিন্তু অভিন্ন না ফর্ম উপস্থিত হতে থাকে (ডাটা বনাম newtype, রেকর্ড -স্টাইল বনাম সাধারণ কন্সট্রাক্টর এবং আরও কিছু)। এটি বিরক্তিকর এবং লেখার পুনরাবৃত্তি এবং যান্ত্রিক না হওয়ার পক্ষে যথেষ্ট জটিল। সংস্কার প্রস্তাব ঠিকানাগুলি এই কিছু (উদ্ধৃতি আরও ব্যাপক ভাবে প্রযোজ্য উপার্জন)।

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

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

  • এটি আপনাকে জিএইচসির সাথে সংযুক্ত করে। তত্ত্বগতভাবে অন্য একটি সংকলক এটি বাস্তবায়ন করতে পারে তবে বাস্তবে আমি সন্দেহ করি যে এটি কখনও ঘটবে। (এটি বিভিন্ন ধরণের সিস্টেম এক্সটেনশনের বিপরীতে যা এ মুহূর্তে কেবলমাত্র এইচএইচসি দ্বারা প্রয়োগ করা যেতে পারে, আমি সহজেই অন্য রাস্তাগুলি দ্বারা রাস্তায় নেমে অবশেষে প্রমিতকরণের কল্পনা করতে পারি))

  • এপিআই স্থিতিশীল নয়। যখন জিএইচসিতে নতুন ভাষার বৈশিষ্ট্য যুক্ত করা হয় এবং তাদের সমর্থন করার জন্য টেমপ্লেট-হ্যাশেল প্যাকেজ আপডেট করা হয়, তখন এটি বেশিরভাগ টিএইচ ডেটাটাইপগুলিতে পিছনে-অসামঞ্জস্যপূর্ণ পরিবর্তনগুলির সাথে জড়িত। আপনি যদি চান আপনার টিএইচ কোডটি GHC এর একাধিক সংস্করণের সাথে সামঞ্জস্যপূর্ণ হয় তবে আপনাকে খুব সতর্কতা অবলম্বন করা এবং সম্ভবত ব্যবহার করা দরকার CPP

  • একটা সাধারণ নীতি যে আপনার কাজ এবং ক্ষুদ্রতম এক যে যথেষ্ট হবে জন্য ডান টুল ব্যবহার করা উচিত, এবং যে উপমা এই টেমপ্লেটের মধ্যে Haskell হয় ভালো কিছু । এটি করার কোনও উপায় যদি এটি টেম্পলেট হাস্কেল নয় তবে এটি সাধারণত পছন্দনীয়।

টেমপ্লেট হাস্কেলের সুবিধা হ'ল আপনি এটি দিয়ে এমন জিনিসগুলি করতে পারেন যা আপনি অন্য কোনও উপায়ে করতে পারেন নি এবং এটি একটি বড় one বেশিরভাগ সময় TH টি জিনিস ব্যবহার করা হয় অন্যথায় কেবল তখনই করা যেতে পারে যদি সেগুলি সরাসরি সংকলক বৈশিষ্ট্য হিসাবে প্রয়োগ করা হত। এই দুটি জিনিসই রাখা অত্যন্ত উপকারী কারণ এটি আপনাকে এই জিনিসগুলি করতে দেয় এবং কারণ এটি আপনাকে সম্ভাব্য সংকলক এক্সটেনশনগুলিকে আরও বেশি লাইটওয়েট এবং পুনরায় ব্যবহারযোগ্য উপায়ে প্রোটোটাইপ করতে দেয় (উদাহরণস্বরূপ বিভিন্ন লেন্সের প্যাকেজগুলি দেখুন)।

টেমপ্লেট হাস্কেলের প্রতি কেন আমার নেতিবাচক অনুভূতি রয়েছে বলে সংক্ষিপ্তসার হিসাবে বলা যায়: এটি অনেক সমস্যা সমাধান করে, তবে যে কোনও সমস্যার সমাধান করে তবে মনে হয় যে সমস্যাটি সমাধানের জন্য আরও ভাল, আরও মার্জিত, শৃঙ্খলাবদ্ধ সমাধান হওয়া উচিত, এক যা সমস্যা সমাধানের নেই স্বয়ংক্রিয়ভাবে boilerplate, উৎপাদিত দ্বারা, কিন্তু করার প্রয়োজনীয়তা সরিয়ে আছে boilerplate,।

* যদিও আমি প্রায়শই অনুভব করি যে CPPএটি সমাধান করতে পারে সেই সমস্যাগুলির জন্য পাওয়ার-টু-ওজন অনুপাতের চেয়ে ভাল।

২৩-০৪-১৪ সম্পাদনা করুন: আমি প্রায়শই উপরোক্তটিতে যাবার চেষ্টা করছিলাম এবং সম্প্রতি সম্প্রতি পেয়েছি এটি হ'ল বিমূর্তি এবং নকলের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য। যথাযথ বিমূর্ততা প্রায়শই পার্শ্ব প্রতিক্রিয়া হিসাবে ডুপ্লিকেশনের ফলাফল করে এবং সদৃশ প্রায়শই অপর্যাপ্ত বিমূর্ততার একটি টটলেট চিহ্ন, তবে কেন এটি মূল্যবান নয়। সঠিক বিমূর্ততা হ'ল কোডটি সঠিক, বোধগম্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। প্রতিলিপি শুধুমাত্র এটি খাটো করে তোলে। সাধারণভাবে ম্যাক্রোগুলির মতো টেম্পলেট হাস্কেল হ'ল প্রতিলিপি তৈরির একটি সরঞ্জাম।


"এই সমস্যাগুলি সমাধান করতে পারে সেগুলির জন্য সিপিপিতে পাওয়ার-টু-ওয়েট রেশিও রয়েছে"। প্রকৃতপক্ষে. এবং C99 এ এটি যা খুশি তা সমাধান করতে পারে। এগুলি বিবেচনা করুন: সিওএস , বিশৃঙ্খলা । লোকেরা কেন এএসটি প্রজন্মকে আরও ভাল বলে মনে করে আমি তা বুঝতে পারি না। এটি কেবলমাত্র আরও অস্পষ্টতা এবং অন্যান্য ভাষার বৈশিষ্ট্যগুলির তুলনায় কম অরথোগোনাল
ব্রিটন কেরিন

31

আমি dflemstr প্রকাশিত কয়েকটি বিষয় সম্বোধন করতে চাই।

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

যদি কোনও TH এক্সপ্রেশন / কোয়াস্ট-কোটারটি এমন কোনও কিছু করে যাতে কৌতুকপূর্ণ কোণগুলি আড়াল করতে পারে তবে সম্ভবত এটি অসুস্থ-পরামর্শ দেওয়া?

আমি ইদানীং (হ্যাশেল-এসসিআরসি-এক্সটস / মেটা ব্যবহার করে) কাজ করা কোয়াটি-কোটারগুলির সাথে এই নিয়মটি বেশ খানিকটা ভাঙ্গি - https://github.com/mgsloan/quasi-extras/tree/master/example । আমি জানি এটি কিছু বাগের সাথে পরিচিত করে যেমন সাধারণকরণ তালিকা বোধগম্যতায় বিভাজন করতে সক্ষম না হওয়া। তবে আমি মনে করি যে http://hackage.haskell.org/trac/ghc/blog/Template%20Haskell%20- এ কিছু ধারণাগুলি সংকলকটিতে শেষ হওয়ার একটা ভাল সুযোগ রয়েছে । ততক্ষণে, হাস্কেলকে টিএইচ গাছগুলিতে পার্স করার জন্য গ্রন্থাগারগুলি প্রায় নিখুঁত অনুমান।

সংকলনের গতি / নির্ভরতা সম্পর্কে, আমরা উত্পন্ন কোডটি ইনলাইন করতে "জিরোথ" প্যাকেজটি ব্যবহার করতে পারি। এটি কোনও প্রদত্ত লাইব্রেরির ব্যবহারকারীদের পক্ষে কমপক্ষে চমৎকার, তবে আমরা গ্রন্থাগারটি সম্পাদনার ক্ষেত্রে আরও ভাল কিছু করতে পারি না। টিএইচ নির্ভরতা কি বাইনারি উত্পন্ন? আমি ভেবেছিলাম এটি সংকলিত কোড দ্বারা রেফারেন্স না থাকা সমস্ত কিছু ফেলেছে।

হাস্কেল মডিউলের সংকলন পদক্ষেপের মঞ্চবদ্ধতা / বিভাজন স্তন্যপান করে।

আরআর অস্বচ্ছতা: আপনি যে কোনও লাইব্রেরি ফাংশন কল করেন এটি একই। Data.List.groupBy কী করবে তার উপর আপনার কোনও নিয়ন্ত্রণ নেই। আপনার কাছে কেবল একটি যুক্তিসঙ্গত "গ্যারান্টি" / কনভেনশন রয়েছে যা সংস্করণ নম্বরগুলি আপনাকে সামঞ্জস্যতা সম্পর্কে কিছু বলবে। এটা পরিবর্তন যখন কিছুটা আলাদা বিষয়।

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

আর একতরফা: আপনার নিজের সংকলন-সময় কোডটি ব্যবহার করে আপনি অবশ্যই কোনও TH এক্সপ্রেশনের ফলাফল পোস্ট-প্রক্রিয়া করতে পারেন। শীর্ষ-স্তরের ঘোষণার ধরণ / নামগুলিতে ফিল্টার করা খুব বেশি কোড হবে না। হেক, আপনি এমন কোনও ফাংশন লেখার কল্পনা করতে পারেন যা এটি সাধারণভাবে করে। কোয়াশিকোটারগুলিকে সংশোধন / ডি-মোনোলিথাইজাইজ করার জন্য, আপনি "QuasiQuoter" এর সাথে মিল রেখে প্যাটার্নগুলি ব্যবহার করতে পারেন এবং ব্যবহৃত রূপান্তরগুলি খুঁজে বের করতে পারেন বা পুরানো শর্তাবলী অনুসারে একটি নতুন তৈরি করতে পারেন।


1
সংক্রান্ত অস্পষ্টতা / Monolithism: একটি মাধ্যমে অবশ্যই হাঁটার আপনি করতে পারেন [Dec]এবং অপসারণ কাপড় যে আপনি চান না, কিন্তু ধরুন ফাংশন একটি বহিস্থিত সংজ্ঞা ফাইল সার্চ যে যখন তাদেরকে JSON ইন্টারফেস উৎপাদিত যাক। আপনি Decজেনারেটরটি সংজ্ঞায়িত ফাইলটি অনুসন্ধান করা বন্ধ করে না এমনটি ব্যবহার না করে কেবল সংকলনটি ব্যর্থ করে তোলে। সেই কারণে, Qমোনাডের আরও সীমাবদ্ধ সংস্করণটি পাওয়া ভাল লাগবে যা আপনাকে নতুন নাম (এবং এই জাতীয় জিনিস) তৈরি করতে দেয় তবে অনুমতি দেয় না IO, যাতে করে আপনি বলেন যে কেউ এর ফলাফলগুলি ফিল্টার করতে পারে / অন্যান্য রচনাগুলি করতে পারে ।
dflemstr

1
আমি সম্মত, Q / quotation এর একটি নন-আইও সংস্করণ থাকা উচিত! এটি সমাধানেও সহায়তা করবে - stackoverflow.com/questions/7107308/… । একবার আপনি নিশ্চিত করে ফেললেন যে সংকলন-সময় কোডটি অনিরাপদ কিছু না করে, মনে হয় আপনি ফলাফলের কোডটিতে সুরক্ষা চেকারটি চালাতে পেরেছেন এবং নিশ্চিত করুন যে এটি ব্যক্তিগত স্টাফটিকে রেফারেন্স দিচ্ছে না।
mgsloan

1
আপনি কি কখনও আপনার পাল্টা প্রতিবেদন লিখেছেন? এখনও আপনার প্রতিশ্রুতিবদ্ধ লিঙ্কটির জন্য অপেক্ষা করছি। যারা এই উত্তরের পুরাতন বিষয়বস্তুগুলি সন্ধান করছেন তাদের জন্য: stackoverflow.com/revisions/10859441/1 , এবং মুছে ফেলা সামগ্রী দেখতে পারেন তাদের জন্য: stackoverflow.com/revisions/10913718/6
ড্যান বার্টন

1
হ্যাকেজের সংস্করণের চেয়ে জিরোথের আরও আধুনিক সংস্করণ কি নেই? সেই একটি (এবং ডার্কস রেপো) সর্বশেষ ২০০৯ সালে আপডেট করা হয়েছিল Both
অ্যাভোগ্ট

1
@ আভাগট টেজিকি এটি সংশোধন করার জন্য কাজ করছিল, তবে আমি মনে করি না তিনি শেষ করেছেন: github.com/technogeeky/zeroth যদি কেউ এর জন্য / কিছু করে না, আমি অবশেষে এটির কাছাকাছি পৌঁছে যাব।
mgsloan

16

এই উত্তরটি ইলিশিয়াস দ্বারা উত্থাপিত বিষয়গুলির প্রতিক্রিয়া হিসাবে, পয়েন্ট-পয়েন্ট:

  • এটি ব্যবহার করা কুৎসিত। f (fooBar '' Asdf) ঠিক দেখতে সুন্দর দেখাচ্ছে না। অতিমাত্রায়, নিশ্চিত, তবে এটি অবদান রাখে।

আমি রাজী. আমার মনে হয় $ () ভাষাটির মতো দেখতে দেখতে বেছে নেওয়া হয়েছিল - হাস্কেলের পরিচিত প্রতীক প্যালেটটি ব্যবহার করে। যাইহোক, আপনার ম্যাক্রো স্প্লাইসিংয়ের জন্য ব্যবহৃত প্রতীকগুলিতে আপনি যা চান / ঠিক তা চান না। এগুলি অবশ্যই খুব বেশি মিশ্রিত হয় এবং এই অঙ্গরাগ দিকটি বেশ গুরুত্বপূর্ণ। আমি স্প্লাইসগুলির জন্য {{} of এর চেহারা পছন্দ করি কারণ এগুলি বেশ দৃশ্যত পৃথক।

  • এটি লিখতে এমনকি খারাপ। উদ্ধৃতি কখনও কখনও কাজ করে তবে অনেক সময় আপনাকে ম্যানুয়াল এএসটি গ্রাফটিং এবং নদীর গভীরতানির্ণয় করতে হয়। [এপিআই] [১] বড় এবং অযথাযুক্ত, সবসময় এমন অনেকগুলি কেস থাকে যা আপনার যত্ন নেয় না তবে তবুও প্রেরণ করা প্রয়োজন এবং আপনি যে কেসগুলি যত্নবান সেগুলি একাধিক অনুরূপ তবে অভিন্ন আকারে উপস্থিত হওয়ার প্রবণতা রয়েছে (ডাটা) বনাম নতুন টাইপ, রেকর্ড-স্টাইল বনাম সাধারণ নির্মাণকারী এবং আরও অনেক কিছু)। এটি বিরক্তিকর এবং লেখার পুনরাবৃত্তি এবং যান্ত্রিক না হওয়ার পক্ষে যথেষ্ট জটিল। [সংস্কার প্রস্তাব] [২] এর কয়েকটিকে সম্বোধন করে (আরও ব্যাপকভাবে প্রযোজ্য উক্তি তৈরি করা)।

আমি এটির সাথেও একমত, তবে, "টিএইচ নতুন নির্দেশাবলীর জন্য" র মতামতের কয়েকটি হিসাবে পর্যবেক্ষণ করা হয়েছে, বক্সের বাইরে এএসটি উদ্ধৃতি দেওয়ার ভাল অভাব একটি সমালোচনামূলক ত্রুটি নয়। এই ডাব্লুআইপি প্যাকেজে, আমি গ্রন্থাগার আকারে এই সমস্যাগুলি সমাধান করতে চাই: https://github.com/mgsloan/quasi-extras । এখন পর্যন্ত আমি স্বাভাবিকের চেয়ে আরও কয়েকটি জায়গায় স্প্লিকিংয়ের অনুমতি দিচ্ছি এবং এটিএসটিতে প্যাটার্নটি মেলাতে পারি।

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

আমি চক্রীয় টিএইচ সংজ্ঞাটি আগে অসম্ভব হয়ে উঠার সমস্যাটি নিয়ে এসেছি ... এটি বেশ বিরক্তিকর। একটি সমাধান রয়েছে, তবে এটি কুৎসিত - চক্রীয় নির্ভরতার সাথে জড়িত জিনিসগুলিকে একটি টিএইচ প্রকাশের মধ্যে আবদ্ধ করুন যা উত্পন্ন সমস্ত ঘোষণার সাথে সম্মিলিত হয়। এই ঘোষণার জেনারেটরগুলির মধ্যে একটি হ'ল স্কেল কোড গ্রহণ করে এমন একটি কোয়া-কোটার হতে পারে।

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

আপনি যদি এর সাথে নীতিহীন কিছু করেন তবে এটি কেবল তাত্ত্বিক নয়। পার্থক্যটি হ'ল বিমূর্তকরণের জন্য সংকলক বাস্তবায়িত প্রক্রিয়াগুলির সাথে আপনার আরও আস্থা আছে যে বিমূর্ততাটি ফাঁস নয়। সম্ভবত ভাষা নকশাকে গণতন্ত্রকরণ কিছুটা ভীতিজনক মনে হচ্ছে! টিএইচ লাইব্রেরির স্রষ্টাদের তাদের সরবরাহ করা সরঞ্জামগুলির অর্থ এবং ফলাফলগুলি পরিষ্কারভাবে ডকুমেন্ট এবং স্পষ্টভাবে সংজ্ঞায়িত করতে হবে। নীতিগত TH এর একটি ভাল উদাহরণ হ'ল ডেরিভ প্যাকেজ: http://hackage.haskell.org/package/derive - এটি একটি ডিএসএল ব্যবহার করে যাতে অনেকগুলি ডেরাইভেশন / স্পেসিফিকেশন / প্রকৃত ডেরাইভেশন এর উদাহরণ।

  • এটি আপনাকে জিএইচসির সাথে সংযুক্ত করে। তত্ত্বগতভাবে অন্য একটি সংকলক এটি বাস্তবায়ন করতে পারে তবে বাস্তবে আমি সন্দেহ করি যে এটি কখনও ঘটবে। (এটি বিভিন্ন ধরণের সিস্টেম এক্সটেনশনের বিপরীতে যা এ মুহূর্তে কেবলমাত্র এইচএইচসি দ্বারা প্রয়োগ করা যেতে পারে, আমি সহজেই অন্য রাস্তাগুলি দ্বারা রাস্তায় নেমে অবশেষে প্রমিতকরণের কল্পনা করতে পারি))

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

যদিও আমি ভুল হতে পারি, আমি কোনও বাস্তবায়ন দৃষ্টিকোণ থেকে টিএইচকে সংকলক বর্ধনের জটিল হিসাবে দেখছি না। এটি আসলে "এটিকে সহজ রাখার" এবং মৌলিক স্তরটি না থাকার কিছুটা তাত্ত্বিকভাবে আবেদনযোগ্য, স্ট্যাটিকালি যাচাইযোগ্য টেম্প্লেটিং সিস্টেম হতে পারে benefits

  • এপিআই স্থিতিশীল নয়। যখন জিএইচসিতে নতুন ভাষার বৈশিষ্ট্য যুক্ত করা হয় এবং তাদের সমর্থন করার জন্য টেমপ্লেট-হ্যাশেল প্যাকেজ আপডেট করা হয়, তখন এটি বেশিরভাগ টিএইচ ডেটাটাইপগুলিতে পিছনে-অসামঞ্জস্যপূর্ণ পরিবর্তনগুলির সাথে জড়িত। আপনি যদি চান আপনার টিএইচ কোডটি GHC এর একাধিক সংস্করণের সাথে সামঞ্জস্যপূর্ণ হয় তবে আপনাকে খুব সতর্কতা অবলম্বন করা এবং সম্ভবত ব্যবহার করা দরকার CPP

এটিও একটি ভাল পয়েন্ট, তবে কিছুটা নাটকীয়। যদিও ইদানীং এপিআই সংযোজন হয়েছে, সেগুলি ব্যাপকভাবে ভাঙ্গা প্ররোচিত হয়নি। এছাড়াও, আমি মনে করি যে আমি আগে উল্লেখ করা উচ্চতর এএসটি উদ্ধৃতি দিয়ে, আসলে যে APIটি ব্যবহার করা দরকার তা খুব হ্রাস করা যেতে পারে। যদি কোনও নির্মাণ / মিলের জন্য পৃথক ফাংশন প্রয়োজন হয় না এবং পরিবর্তে আক্ষরিক হিসাবে প্রকাশ করা হয়, তবে বেশিরভাগ এপিআই অদৃশ্য হয়ে যায়। তদুপরি, আপনার লেখা কোডটি হাস্কেলের মতো ভাষার জন্য এএসটি উপস্থাপনায় আরও সহজে পোর্ট হবে।


সংক্ষেপে, আমি মনে করি যে TH একটি শক্তিশালী, আধা-অবহেলিত সরঞ্জাম tool কম ঘৃণা লাইব্রেরির আরও প্রাণবন্ত ইকো-সিস্টেমের দিকে পরিচালিত করতে পারে, আরও ভাষার বৈশিষ্ট্য প্রোটোটাইপগুলি প্রয়োগের জন্য উত্সাহিত করে। এটি লক্ষ্য করা গেছে যে টিএইচ একটি অতিশক্তিযুক্ত সরঞ্জাম, এটি আপনাকে / করতে / প্রায় কোনও কিছু করতে দেয়। অরাজকতা! ঠিক আছে, আমার মতামত যে এই শক্তি আপনাকে তার সীমাবদ্ধতাগুলির বেশিরভাগটি অতিক্রম করতে এবং যথেষ্ট নীতিগত মেটা-প্রোগ্রামিং পদ্ধতির পক্ষে সক্ষম এমন সিস্টেম তৈরি করতে পারে। "যথাযথ" বাস্তবায়ন অনুকরণ করার জন্য কুৎসিত হ্যাকগুলির ব্যবহার মূল্যবান, কারণ এইভাবে "যথাযথ" বাস্তবায়নের নকশা ধীরে ধীরে স্পষ্ট হয়ে উঠবে।

আমার ব্যক্তিগত আদর্শ সংস্করণের সংস্করণে, ভাষা বেশিরভাগই সংকলকটির বাইরে এই বিভিন্নগুলির লাইব্রেরিতে স্থানান্তরিত করে। বৈশিষ্ট্যগুলি গ্রন্থাগার হিসাবে প্রয়োগ করা হয়েছে তা বিশ্বস্ততার সাথে বিমূর্ত করার ক্ষমতা তাদের পক্ষে খুব বেশি প্রভাবিত করে না।

বয়লারপ্লেট কোডটির সাধারণ হাস্কেল উত্তর কী? বিমূর্ততা। আমাদের প্রিয় বিমূর্ততা কি? ফাংশন এবং টাইপক্লাস!

টাইপ ক্লাসগুলি আমাদের পদ্ধতিগুলির একটি সেট নির্ধারণ করতে দেয়, তারপরে সেই শ্রেণীর জেনেরিকের সমস্ত ধরণের ফাংশনে ব্যবহার করা যেতে পারে। তবে এগুলি ব্যতীত, ক্লাসগুলি বয়লারপ্লেট এড়াতে সহায়তা করার একমাত্র উপায় হ'ল "ডিফল্ট সংজ্ঞা" দেওয়া offering এখন এখানে একটি নীতিহীন বৈশিষ্ট্যের উদাহরণ!

  • সর্বনিম্ন বাঁধাই সেটগুলি ঘোষিত / সংকলক চেকযোগ্য নয়। এটি অসাবধানতার সংজ্ঞা হতে পারে যা পারস্পরিক পুনরাবৃত্তির কারণে নীচে নেমে আসে।

  • মহান সুবিধা এবং ক্ষমতা এই উত্পাদ হবে সত্ত্বেও, আপনি সুপারক্লাস ডিফল্ট, অনাথ দৃষ্টান্ত কারণে নির্দিষ্ট করতে পারেন না http://lukepalmer.wordpress.com/2009/01/25/a-world-without-orphans/ এই আমাদের ঠিক দেওয়া হবে করুণভাবে সংখ্যার শ্রেণিবিন্যাস!

  • পদ্ধতির খেলাপিগুলির জন্য টিএইচ-এর মতো সক্ষমতার পিছনে যাওয়ার ফলে http://www.haskell.org/haskellwiki/GHC.Generics দেখা দেয় । এটি দুর্দান্ত স্টাফ হিসাবে, আমার জেনারিকগুলি ব্যবহার করে ডিবেগিং কোডটি কেবলমাত্র অসম্ভব ছিল, কারণ প্রকারের প্রেরণার আকার এবং এএসটি হিসাবে এটিএসটির মতো জটিল। https://github.com/mgsloan/th-extra/commit/d7784d95d396eb3abdb409a24360beb03731c88c

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

    TH আপনাকে আউটপুট কোডের মান-স্তরের সংকলন-সময় গণনা দেয়, অন্যদিকে জেনেরিকস কোডের প্যাটার্ন ম্যাচিং / পুনরাবৃত্তি অংশটি টাইপ সিস্টেমে তুলতে বাধ্য করে। যদিও এটি ব্যবহারকারীকে কয়েকটি মোটামুটি কার্যকর উপায়ে সীমাবদ্ধ করে, আমি মনে করি না জটিলতা এটির পক্ষে উপযুক্ত।

আমি মনে করি যে টিএইচ এবং লিসপ-এর মতো রূপান্তরকে প্রত্যাখ্যানের ফলে উদাহরণের ঘোষণার মতো আরও নমনীয়, ম্যাক্রো-প্রসারণের পরিবর্তে পদ্ধতি-খেলাপির মতো বিষয়ের দিকে অগ্রাধিকার দেখা দিয়েছে। অস্বীকারহীন ফলাফলের দিকে পরিচালিত করতে পারে এমন বিষয়গুলি এড়ানোর শৃঙ্খলা বুদ্ধিমানের কাজ, তবে আমাদের এড়িয়ে যাওয়া উচিত নয় যে হাস্কেলের সক্ষম টাইপ সিস্টেমটি অন্যান্য পরিবেশের (জেনারেট কোডটি পরীক্ষা করে) তুলনায় আরও নির্ভরযোগ্য মেটাপোগ্রামিংয়ের অনুমতি দেয়।


4
এই উত্তরটি নিজের পক্ষে খুব ভালভাবে দাঁড়ায় না: আপনি অন্য উত্তরের জন্য অনেকগুলি রেফারেন্স তৈরি করছেন যা আমি আপনাকে সঠিকভাবে পড়তে পারার আগে আমাকে খুঁজে বের করতে হবে।
বেন মিলউড

এটা সত্যি. সত্ত্বেও কী সম্পর্কে কথা হচ্ছে তা পরিষ্কার করার চেষ্টা করেছি। সম্ভবত আমি ইলিসিসের পয়েন্টগুলি ইনলাইন করতে সম্পাদনা করব।
mgsloan

আমার বলা উচিত যে সম্ভবত "অবৈধিক" এটি একটি শক্তিশালী শব্দ যা আমার ব্যবহার করা উচিত ছিল, এর সাথে কিছু অভিব্যক্তি যা আমি উদ্দেশ্য করি নি - এটি অবশ্যই বেscমান নয়! সেই বুলেট পয়েন্টটিই আমার সবচেয়ে বেশি সমস্যা ছিল, কারণ আমার এই অনুভূতি বা অব্যক্ত ধারণাটি আমার মাথায় রয়েছে এবং শব্দগুলিতে ফেলতে সমস্যা হয় এবং "অবৈধিকভাবে" শব্দটি আমি আঁকড়ে ধরেছিলাম যা আশেপাশের কোথাও ছিল। "শৃঙ্খলাবদ্ধ" সম্ভবত কাছাকাছি। একটি পরিষ্কার এবং সংক্ষিপ্ত সূত্রটি না পেয়ে আমি এর পরিবর্তে কয়েকটি উদাহরণের জন্য গিয়েছিলাম। যদি কেউ সম্ভবত আমার বোঝার অর্থটি আরও পরিষ্কারভাবে ব্যাখ্যা করতে পারে তবে আমি এটির প্রশংসা করব!
গ্লেভোরল

(এছাড়াও আমি মনে করি আপনি মঞ্চের নিষেধাজ্ঞা এবং কুৎসিত-থেকে-লেখার উদ্ধৃতিগুলি
স্যুইচ করেছেন

1
ডোহ! যে ইশারা জন্য ধন্যবাদ! সংশোধন করা হয়েছে। হ্যাঁ, অনুশাসনযুক্ত এটি সম্ভবত রাখার আরও ভাল উপায়। আমি মনে করি যে এখানে পার্থক্যটি সত্যই "বিল্ট-ইন" এর মধ্যে এবং তাই "অ্যাড-হক", বা ব্যবহারকারীর দ্বারা সংজ্ঞায়িত বিমূর্ততা প্রক্রিয়া বনাম "ভাল বোঝা" বিমূর্ততা প্রক্রিয়া। আমি মনে করি আমার অর্থ হ'ল আপনি বুঝতে পারছেন যে কোনও টিএইচ লাইব্রেরি টাইপক্লাস প্রেরণের সাথে বেশ কিছু অনুরূপ কার্যকর করেছে (রানটাইম নয় সংকলন সময়ে)
mgsloan

8

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

এটি অনুশীলনে প্রাসঙ্গিক: গিট-এনেক্স হ্যাশেল-এ লেখা একটি সরঞ্জাম যা স্টোরেজ সম্পর্কে উদ্বেগজনক মেশিনগুলিতে চালিত হওয়ার অর্থ দেয়, এই জাতীয় মেশিনগুলিতে প্রায়শই নন-আই 386-সিপিইউ থাকে। ব্যক্তিগতভাবে, আমি একটি এনএসএলইউ 2 -তে গিট-অ্যানেক্স চালিত করি (32 এমবি র‌্যাম, 266 মেগাহার্টজ সিপিইউ; আপনি কি জানতেন হাস্কেল এই জাতীয় হার্ডওয়্যারে ভাল কাজ করে?) যদি এটি টেমপ্লেট হাস্কেল ব্যবহার করে তবে এটি সম্ভব নয়।

(এআরএম-তে জিএইচসি সম্পর্কিত পরিস্থিতি এই দিনগুলিতে অনেক উন্নতি করছে এবং আমি মনে করি 7.৪.২ এমনকি কাজ করে, তবে বিষয়টি এখনও দাঁড়িয়ে আছে)।


1
"টেমপ্লেট হাস্কেল স্প্লাইস এক্সপ্রেশনগুলি চালানোর জন্য জিএইচসি অন্তর্নির্মিত বাইটকোড সংকলক এবং দোভাষীর উপর নির্ভর করে।" - haskell.org/ghc/docs/7.6.2/html/users_guide/...
জোয়াকিম Breitner

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

1
(ঘটনাক্রমে, টিচ চেষ্টা করে ইন্টারেক্টিভ ব্যবহারের জন্য গিগি মজাদারভাবে দুর্বল সমর্থন করেছেন ghci -XTemplateHaskell <<< '$(do Language.Haskell.TH.runIO $ (System.Random.randomIO :: IO Int) >>= print; [| 1 |] )')
মুহম্মোহেটেন

ঠিক আছে, জিসিসি সহ আমি জিএইচসি কোডটি ব্যাখ্যা করার (সংকলনের পরিবর্তে) কোডটি জিএসিসি বাইনারিতে ইন্টারেক্টিভভাবে আসে কিনা বা টিএইচ স্প্লাইস থেকে আলাদা করে উল্লেখ করছি independent
জোছিম ব্রেটনার

6

টিএইচ খারাপ কেন? আমার জন্য, এটি এখানে নেমে আসে:

আপনার যদি এত বেশি পুনরাবৃত্তি কোড তৈরি করতে হয় যে আপনি নিজেকে স্বয়ংক্রিয়ভাবে জেনারেট করতে TH ব্যবহার করার চেষ্টা করছেন বলে মনে করেন , আপনি এটি ভুল করছেন!

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

কখনও কখনও, অবশ্যই এটি প্রয়োজনীয়। তবে কখনও কখনও আপনি নিজের ডিজাইনের সাথে কিছুটা বেশি চালাক হয়ে আপনি এইচএইচ এর প্রয়োজন এড়াতে পারেন।

(অন্য জিনিসটি হ'ল টিএইচটি বেশ নিম্ন-স্তরের।


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

@ কুলকোডব্রো হ্যাঁ, কোয়াস্টের উদ্ধৃতিটি বেশ সুন্দর, এবং আমি মনে করি TH এর থেকে কিছুটা অরথোগোনাল। (স্পষ্টতই এটি TH এর শীর্ষে প্রয়োগ করা হয়েছে) আমি TH ব্যবহার করে ক্লাসের উদাহরণ তৈরি করতে, বা একাধিক ধরণের ক্রিয়াকলাপ তৈরি করতে বা এর মতো আরও কিছু নিয়ে ভাবছিলাম।
গাণিতিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.