হাসকেলে এক্সপেনশনেশন


91

কেউ আমাকে বলতে পারেন কেন হাস্কেল প্রিলিউড ক্ষমতার জন্য দুটি পৃথক ফাংশন সংজ্ঞা দেয় (অর্থাত্ ^এবং **)? আমি ভেবেছিলাম টাইপ সিস্টেমটি এই ধরণের সদৃশতা মুছে ফেলার কথা।

Prelude> 2^2
4
Prelude> 4**0.5
2.0

উত্তর:


130

বাস্তবে এমন কোনো তিনটি exponentiation অপারেটার আছেন: (^), (^^)এবং (**)^অ-নেতিবাচক ইন্টিগ্রাল এক্সপেনসনেশন, ^^এটি পূর্ণসংখ্যার এক্সপেনশনেশন এবং **ভাসমান-পয়েন্ট এক্সপেনসিয়েনশন হয়:

(^) :: (Num a, Integral b) => a -> b -> a
(^^) :: (Fractional a, Integral b) => a -> b -> a
(**) :: Floating a => a -> a -> a

কারণটি সুরক্ষা হ'ল: সংখ্যাগত ক্রিয়াকলাপগুলির ফলাফলগুলিতে সাধারণত ইনপুট আর্গুমেন্টের মতোই থাকে type তবে আপনি Intকোনও ভাসমান-বিন্দুতে শক্তি বাড়িয়ে তুলতে পারবেন না এবং ফলাফলের ফল পাবেন Int। এবং তাই টাইপ সিস্টেম আপনাকে এটি করতে বাধা দেয়: (1::Int) ** 0.5একটি টাইপ ত্রুটি তৈরি করে। একই জন্য যায় (1::Int) ^^ (-1)

এটি রাখার আরেকটি উপায়: Numপ্রকারগুলি নীচে বন্ধ থাকে ^(তাদের গুণক বিপরীত হওয়া প্রয়োজন হয় না), Fractionalপ্রকারগুলি নীচে বন্ধ থাকে ^^, Floatingপ্রকারগুলি নীচে বন্ধ থাকে **। যেহেতু এর Fractionalউদাহরণ নেই Int, আপনি এটিকে নেতিবাচক শক্তিতে তুলতে পারবেন না।

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


31

তিনটি ক্ষতিকারক অপারেটরকে এক হিসাবে প্রকাশ করার জন্য হাস্কেলের টাইপ সিস্টেমটি যথেষ্ট শক্তিশালী নয়। আপনি যা চান তা হ'ল এরকম কিছু:

class Exp a b where (^) :: a -> b -> a
instance (Num a,        Integral b) => Exp a b where ... -- current ^
instance (Fractional a, Integral b) => Exp a b where ... -- current ^^
instance (Floating a,   Floating b) => Exp a b where ... -- current **

আপনি যদি মাল্টি-প্যারামিটার ধরণের শ্রেণীর এক্সটেনশানটি চালু করেন সেক্ষেত্রে এটি সত্যিই কাজ করে না, কারণ হ্যাস্কেল বর্তমানে মঞ্জুরি দেয় তার চেয়ে বেশি উদাহরণস্বরূপ নির্বাচনের প্রয়োজন।


4
এটি বাস্তবায়িত হচ্ছে না সে সম্পর্কে বিবৃতি কি এখনও সত্য? আইআইআরসি, হ্যাশেলের কাছে প্রথম পরামিতি দ্বারা কঠোরভাবে নির্ধারণ করার জন্য একটি বহু-পরামিতি টাইপ শ্রেণীর দ্বিতীয় প্যারামিটারের জন্য একটি বিকল্প রয়েছে। এর বাইরে আর কোন সমস্যা আছে যা সমাধান করা যায় না?
রাসেল স্টাওয়ার্ট

4
@ সিংসুলার এটি এখনও সত্য। প্রথম আর্গুমেন্ট দ্বিতীয়টির নির্ধারণ করে না, উদাহরণস্বরূপ, আপনি এক্সপোনেন্ট উভয় হতে চান Intএবং Integer। এই তিনটি দৃষ্টান্তমূলক বিবরণী থাকতে সক্ষম হওয়ার জন্য উদাহরণ রেজোলিউশনে ব্যাকট্র্যাকিং ব্যবহার করতে হবে, এবং কোনও হাস্কেল সংকলক এটি প্রয়োগ করে না।
augustss

7
কি "টাইপ সিস্টেম শক্তিশালী যথেষ্ট নয়" যুক্তি এখনও মার্চ 2015 হিসাবে রাখা?
এরিক কাপলুন

4
আমার পরামর্শ মতো আপনি অবশ্যই এটি লিখতে পারবেন না, তবে এটির এনকোড করার কিছু উপায় থাকতে পারে।
আগস্ট

4
@ এরিক অলিক সম্ভবত স্ট্যান্ডার্ড হাস্কেলের পক্ষে করেছেন, যেহেতু ২০১০ সালের পর থেকে নতুন কোনও হাস্কেল রিপোর্ট প্রকাশিত হয়নি।
মার্টিন ক্যাপোডিসি

10

এটি দুটি অপারেটর সংজ্ঞায়িত করে না - এটি তিনটি সংজ্ঞায়িত করে! রিপোর্ট থেকে:

তিনটি দ্বি-যুক্তির ক্ষতিকারক ক্রিয়াকলাপ রয়েছে: ( ^) কোনও সংখ্যাকে একটি অণুগঠিত পূর্ণসংখ্যার শক্তিতে ^^উত্থাপন করে , ( ) কোনও পূর্ণসংখ্যার পাওয়ারে ভগ্নাংশের সংখ্যা বাড়ায় এবং ( **) দুটি ভাসমান-পয়েন্ট যুক্তি নেয়। শূন্য সহ যে কোনওটির মান 1 x^0বা x^^01 x; 0**yঅনির্ধারিত.

এর অর্থ এখানে তিনটি পৃথক পৃথক অ্যালগরিদম রয়েছে যার মধ্যে দুটি সঠিক ফলাফল দেয় ( ^এবং ^^), যখন **আনুমানিক ফলাফল দেয়। কোন অপারেটরটি ব্যবহার করবেন তা চয়ন করে আপনি কোন অ্যালগরিদমটি প্রার্থনা করবেন তা চয়ন করুন।


4

^এটির দ্বিতীয় যুক্তির প্রয়োজন Integral। যদি আমি ভুল না হয়ে থাকি তবে আপনি যদি জানতেন যে আপনি একটি অবিচ্ছেদ্য এক্সপোস্টেনেন্টের সাথে কাজ করছেন তবে বাস্তবায়নটি আরও কার্যকর হতে পারে। এছাড়াও, যদি আপনি এমন কিছু চান 2 ^ (1.234), যদিও আপনার বেসটি একটি অবিচ্ছেদ্য, 2, তবে আপনার ফলাফল অবশ্যই আপেক্ষিক হবে। আপনার আরও বিকল্প রয়েছে যাতে আপনার ক্ষতিকারক ক্রিয়াকলাপটি কী ধরণের এবং কী ধরণের ঘটছে তার উপর আপনার আরও কড়া নিয়ন্ত্রণ থাকতে পারে।

হ্যাস্কেলের টাইপ সিস্টেমে অন্যান্য টাইপ সিস্টেমের মতো লক্ষ্য নেই, যেমন সি এর, পাইথন বা লিস্পের। হাঁসের টাইপিং হ্যাশেল মানসিকতার বিপরীতে (প্রায়)।


4
আমি পুরোপুরি একমত নই যে হাস্কেল টাইপের মানসিকতা হাঁসের টাইপের বিপরীত। হাস্কেল টাইপের ক্লাসগুলি হাঁসের টাইপের মতো অনেকটা। class Duck a where quack :: a -> Quackআমরা হাঁসের কী প্রত্যাশা করি তা সংজ্ঞায়িত করে এবং তারপরে প্রতিটি উদাহরণ এমন কিছু নির্দিষ্ট করে যা হাঁসের মতো আচরণ করতে পারে।
augustss

9
@ অগাস্টস আমি দেখতে পেয়েছি আপনি কোথা থেকে এসেছেন। তবে হাঁসের টাইপিংয়ের পিছনে অনানুষ্ঠানিক বক্তব্যটি "এটি যদি হাঁসের মতো দেখায়, হাঁসের মতো কাজ করে এবং হাঁসের মতো কোঁক দেয়, তবে এটি একটি হাঁসের মতো।" হাস্কেলের ক্ষেত্রে এটি কোনও হাঁস নয়, যদি না এটির উদাহরণ ঘোষণা করা হয় Duck
ড্যান বার্টন

4
এটা সত্য, তবে আমি হাস্কেলের কাছে এটাই প্রত্যাশা করছিলাম। আপনি হাঁসের মতো যে কোনও কিছু তৈরি করতে পারেন তবে আপনাকে এটি সম্পর্কে সুস্পষ্ট হতে হবে। আমরা এমন কিছু ভুল করতে চাই না যা আমরা হাঁসের হতে চাইনি।
অগাস্টস

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

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