যোগফলের প্রকার - কেন হাস্কেলের মধ্যে `শো (ইন্ট | ডাবল)` এর চেয়ে আলাদা `(প্রদর্শন ইন্টার) (ডাবল দেখান) `


9

এগুলি কেন সমতুল্য নয়?

show $ if someCondition then someInt else some double

এবং

if someCondition then show someInt else show someDouble

আমি বুঝতে পারি যে আপনি যদি if ... elseপ্রথম উদাহরণের অংশটি নিজেই একটি অভিব্যক্তিতে বিচ্ছিন্ন করে থাকেন তবে আপনি Int | Doubleটাইপস্ক্রিপ্টে সহজেই কিছু করতে পারেন এমন কোনও ধরণের, বেনামে যোগফলের ধরণের সাথে এর ধরণের প্রতিনিধিত্ব করতে পারবেন না (টাইপস্ক্রিপ্ট উল্লেখ করে কারণ এটি আমি প্রায়শই ব্যবহার করি এবং এটি সামমের ধরণেরগুলিকে সমর্থন করে) ল্যাঙ্গেজ, এবং তার Eitherউপর ভিত্তি করে কল করার পরে ডেটা ব্যবহার করতে হবে show

আমি এখানে যে উদাহরণটি দিয়েছি তা তুচ্ছ, তবে আমার কাছে এটি মনে করা আরও someConditionঅর্থবোধ করে যে "ঠিক আছে আমরা কিছু দেখাতে যাচ্ছি, " যে " কিছু ঠিক আছে যদি কিছু সত্য হয় তবে কিছুটা দেখান অন্যথায় কিছুটা ডাবল" প্রদর্শন করুন, এবং এটিও অনুমতি দেয় কম কোড সদৃশতার জন্য (এখানে শোটি পুনরায় পুনরাবৃত্তি করা হয়েছে তবে এটি একটি দীর্ঘ ফাংশন অ্যাপ্লিকেশন if ... elseহতে পারে এবং এর পরিবর্তে>> 2 টি শাখা বিবেচনা করা যেতে পারে)

আমার মনে মনে সংকলকটির জন্য এটি পরীক্ষা করা সহজ হওয়া উচিত যে যোগফলের ধরণ তৈরি করে এমন প্রতিটি ধরণের (এখানে Int | Double) showকার্যকারিতা হিসাবে প্যারামিটার হিসাবে ব্যবহার করা যেতে পারে এবং প্রকারগুলি সঠিক কিনা তা স্থির করে কিনা check আরও ভাল এটি যে showফাংশনটি সর্বদা stringপ্যারামিটারগুলির প্রকারের কোনও কারণই ফেরত দেয় না, তাই সংকলকটি এটির সাথে সমস্ত সম্ভাব্য "শাখা" বহন করে না (সুতরাং সমস্ত সম্ভাব্য প্রকারগুলি)।

এটি কি পছন্দ করে এমন বৈশিষ্ট্যটির অস্তিত্ব নেই? বা আমার মনে হয় যে এটি আরো কার্যকর করা হয়?


2
একটি if ... then ... else ..., এ একই ধরনের প্রয়োজন আছে thenএবং elseঅংশ। আপনি কিছু প্রোগ্রামিং ভাষায় এটি টের্নারি অপারেটর হিসাবে দেখতে পারেন।
উইলেম ভ্যান অনসেম

1
আমি প্রায় একমত making all conversions explicit। আমার প্রশ্নে, আমি চাই না যে হাস্কেল Intএকটি Doubleবা তার বিপরীতে একটি .ালাই। আমি কেবল উদাহরণ হিসাবে এই দুটি ধরণের ব্যবহার করেছি। আপনি প্রতিটি প্রতিস্থাপন করতে পারে Intসঙ্গে aএবং Doubleসঙ্গে bআমার প্রশ্ন যেখানে উভয় প্রকারের আহরণ মধ্যে Show। আমি বুঝতে পেরেছি যে anonymous sum typesহাস্কেলের মধ্যে কোনও নেই তবে আমি জানতে চাই যে এটি কেন এবং ভাষাটি এটির ডিজাইন করতে আমাদের কীভাবে বাধা দিচ্ছে।
মেহেদী সাফার

4
আমি মনে করি এই জাতীয় প্রকারকে ইউনিয়ন প্রকার বলা হয় । একটি যোগ টাইপ মূলত ইউনিয়ন টাইপের একটি ট্যাগযুক্ত বৈকল্পিক, যেখানে প্রতিটি মান অবশ্যই অভ্যন্তরের প্রকারের মানের বাইরে একটি বাম / ডান ট্যাগ বহন করে। আমি আশা করি ইউনিয়নের প্রকারের সাথে হ্যাস্কেলের সমস্ত প্রকারের স্তরের বৈশিষ্ট্যগুলির সাথে এই ধরণের অনুক্রমটি অর্জন করা খুব কঠিন hard যদি x :: Int | Boolএবং আমাদের সংকলন করতে হয় show x, তবে showটাইপ-ইরেজর ভিত্তিক আরটিএসে কল করার জন্য কোন পয়েন্টার-টু ফাংশনটি ব্যবহার করা হবে তা জানার সহজ উপায় নেই । আমাদের সম্ভবত রানটাইমের সময় কিছু ধরণের স্তরের তথ্য রাখা দরকার।
চি

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

4
(String, Int)বেনামে নয়। এটি মজাদার সিনট্যাক্স সহ কেবল একটি নিয়মিত পণ্যের ধরণ। (String | Int)সম্পূর্ণ ভিন্ন হবে। নিজেকে জিজ্ঞাসা করে শুরু করুন যে (Int|Int)একইরকম Intএবং কেন হওয়া উচিত ।
এন। 'সর্বনাম' মি।

উত্তর:


8

একটি এক্সপ্রেশন সমস্ত অংশ ভাল টাইপ করা আবশ্যক। প্রকারের if someCondition then someInt else someDoubleমতো কিছু হতে হবে exists a. Show a => aতবে হাস্কেল সেই ধরণের অস্তিত্বের পরিমাপ সমর্থন করে না।

আপডেট: চি যেমন একটি মন্তব্যে উল্লেখ করেছে , হাস্কেলের যদি ইউনিয়ন / ছেদ করার ধরণের (যা যোগফল / পণ্যের ধরণের হিসাবে সমান নয়) সমর্থন করে তবে এটি সম্ভব হবে তবে দুর্ভাগ্যক্রমে এটি হয় না।


ইউনিয়ন / ছেদ করার ধরণের এবং যোগফল / পণ্যের ধরণের পার্থক্য সম্পর্কে আপনি কি দয়া করে বিস্তারিত বলতে পারেন? আমি কি সবসময় ভেবেছি এগুলি একই ছিল, বেনামি বাদে?
মেহেদী সাফার

1
@ মেহেদী সাফার নামবিহীন, যেমন নামবিহীন কনস্ট্রাক্টরের মতো নয় ag অন্য কথায়, যদি আপনার কাছে থাকে Int ∪ Doubleতবে আপনি জানতে পারবেন যে আপনার দুটির মধ্যে একটি রয়েছে তবে এটি কোনটির সাথে মিল খুঁজে পাবে না, তাই আপনি কেবল এমন দুটি জিনিসই করতে পারেন যা উভয় সম্ভাবনার জন্যই বৈধ।
জোসেফ সিবল-রিইনস্টেট মনিকা

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

7

হালকা ওজনের সিনট্যাক্স সহ পণ্যের ধরণ রয়েছে যা (,)হ্যাসকেলে লিখিত রয়েছে । একটি জিনিস হ'ল লাইটওয়েট সিনট্যাক্স সহ একটি যোগফল টাইপ, এর মতো কিছু (Int | String)দুর্দান্ত ধারণা হবে would বাস্তবতা আরও জটিল। আসুন দেখি কেন (আমি কিছুটা স্বাধীনতা নিয়ে নিচ্ছি Num, সেগুলি গুরুত্বপূর্ণ নয়)।

if someCondition then 42 else "helloWorld"

যদি এটির মতো ধরণের কোনও মান ফেরত দেওয়া (Int | String)উচিত তবে নিম্নলিখিতটি কী প্রদান করবে?

if someCondition then 42 else 0

(Int | Int)স্পষ্টতই, তবে এটি যদি সাধারণ থেকে পৃথক হয় Intতবে আমরা গভীর সমস্যায় আছি। সুতরাং (Int | Int)প্লেইন অভিন্ন হতে হবে Int

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

আসুন এই ফাংশনটি দেখুন।

mysteryType x a b = if x then a else b

এখন কি টাইপ mysteryTypeআছে? স্পষ্টত

mysteryType :: Bool -> a -> b -> (a|b)

ঠিক আছে? এখন কি যদি aএবং bএকই ধরনের হয়?

let x = mysteryType True 42 0

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

তাই হ্যা. কেন হাসেল একটি টাইপস্ক্রিপ্ট নয়? কারণ আমাদের আর একটি টাইপস্ক্রিপ্টের দরকার নেই। আপনি যদি টাইপস্ক্রিপ্ট চান তবে এটি কোথায় পাবেন তা আপনি জানেন।


1
পছন্দ করুন আমি মনে করি এটি কোনও উপায়ে বা অন্যভাবে সহায়ক। হ্যাঁ আমি এক মুহুর্তের জন্য থেমেছি এবং এটি অন্তর্ভুক্ত করব কিনা তা ভেবে। তবে আমি মাঝে মাঝে ভুল বলে পরিচিত।
এন। 'সর্বনাম' মি।

কোনও সমস্যা নেই, এটি আপনার পোস্ট, আপনি সিদ্ধান্ত নিন।
মিচা উইডেনম্যান

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