কেউ আমাকে বলতে পারেন কেন হাস্কেল প্রিলিউড ক্ষমতার জন্য দুটি পৃথক ফাংশন সংজ্ঞা দেয় (অর্থাত্ ^
এবং **
)? আমি ভেবেছিলাম টাইপ সিস্টেমটি এই ধরণের সদৃশতা মুছে ফেলার কথা।
Prelude> 2^2
4
Prelude> 4**0.5
2.0
কেউ আমাকে বলতে পারেন কেন হাস্কেল প্রিলিউড ক্ষমতার জন্য দুটি পৃথক ফাংশন সংজ্ঞা দেয় (অর্থাত্ ^
এবং **
)? আমি ভেবেছিলাম টাইপ সিস্টেমটি এই ধরণের সদৃশতা মুছে ফেলার কথা।
Prelude> 2^2
4
Prelude> 4**0.5
2.0
উত্তর:
বাস্তবে এমন কোনো তিনটি 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
।
তিনটি ক্ষতিকারক অপারেটরকে এক হিসাবে প্রকাশ করার জন্য হাস্কেলের টাইপ সিস্টেমটি যথেষ্ট শক্তিশালী নয়। আপনি যা চান তা হ'ল এরকম কিছু:
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 **
আপনি যদি মাল্টি-প্যারামিটার ধরণের শ্রেণীর এক্সটেনশানটি চালু করেন সেক্ষেত্রে এটি সত্যিই কাজ করে না, কারণ হ্যাস্কেল বর্তমানে মঞ্জুরি দেয় তার চেয়ে বেশি উদাহরণস্বরূপ নির্বাচনের প্রয়োজন।
Int
এবং Integer
। এই তিনটি দৃষ্টান্তমূলক বিবরণী থাকতে সক্ষম হওয়ার জন্য উদাহরণ রেজোলিউশনে ব্যাকট্র্যাকিং ব্যবহার করতে হবে, এবং কোনও হাস্কেল সংকলক এটি প্রয়োগ করে না।
এটি দুটি অপারেটর সংজ্ঞায়িত করে না - এটি তিনটি সংজ্ঞায়িত করে! রিপোর্ট থেকে:
তিনটি দ্বি-যুক্তির ক্ষতিকারক ক্রিয়াকলাপ রয়েছে: (
^
) কোনও সংখ্যাকে একটি অণুগঠিত পূর্ণসংখ্যার শক্তিতে^^
উত্থাপন করে , ( ) কোনও পূর্ণসংখ্যার পাওয়ারে ভগ্নাংশের সংখ্যা বাড়ায় এবং (**
) দুটি ভাসমান-পয়েন্ট যুক্তি নেয়। শূন্য সহ যে কোনওটির মান 1x^0
বাx^^0
1x
;0**y
অনির্ধারিত.
এর অর্থ এখানে তিনটি পৃথক পৃথক অ্যালগরিদম রয়েছে যার মধ্যে দুটি সঠিক ফলাফল দেয় ( ^
এবং ^^
), যখন **
আনুমানিক ফলাফল দেয়। কোন অপারেটরটি ব্যবহার করবেন তা চয়ন করে আপনি কোন অ্যালগরিদমটি প্রার্থনা করবেন তা চয়ন করুন।
^
এটির দ্বিতীয় যুক্তির প্রয়োজন Integral
। যদি আমি ভুল না হয়ে থাকি তবে আপনি যদি জানতেন যে আপনি একটি অবিচ্ছেদ্য এক্সপোস্টেনেন্টের সাথে কাজ করছেন তবে বাস্তবায়নটি আরও কার্যকর হতে পারে। এছাড়াও, যদি আপনি এমন কিছু চান 2 ^ (1.234)
, যদিও আপনার বেসটি একটি অবিচ্ছেদ্য, 2, তবে আপনার ফলাফল অবশ্যই আপেক্ষিক হবে। আপনার আরও বিকল্প রয়েছে যাতে আপনার ক্ষতিকারক ক্রিয়াকলাপটি কী ধরণের এবং কী ধরণের ঘটছে তার উপর আপনার আরও কড়া নিয়ন্ত্রণ থাকতে পারে।
হ্যাস্কেলের টাইপ সিস্টেমে অন্যান্য টাইপ সিস্টেমের মতো লক্ষ্য নেই, যেমন সি এর, পাইথন বা লিস্পের। হাঁসের টাইপিং হ্যাশেল মানসিকতার বিপরীতে (প্রায়)।
class Duck a where quack :: a -> Quack
আমরা হাঁসের কী প্রত্যাশা করি তা সংজ্ঞায়িত করে এবং তারপরে প্রতিটি উদাহরণ এমন কিছু নির্দিষ্ট করে যা হাঁসের মতো আচরণ করতে পারে।
Duck
।