কেন স্কালার ফাংশনগুলির সুস্পষ্ট রিটার্ন টাইপ থাকতে হবে?


11

আমি সম্প্রতি স্কালায় প্রোগ্রাম শিখতে শুরু করেছি এবং এখনও পর্যন্ত এটি মজাদার। আমি সত্যিই অন্য ফাংশনটির মধ্যে ফাংশনগুলি ঘোষণা করার ক্ষমতা পছন্দ করি যা কেবল স্বজ্ঞাত জিনিস বলে মনে হয়।

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

ফাংশনগুলিতে সুস্পষ্ট রিটার্ন ধরণের ঘোষণার প্রয়োজনীয়তা, জাভা এবং সি ++ এর মতো ভাষার জন্য আমাকে বিরক্ত করবেন না। জাভা এবং সি ++ এ পুনরাবৃত্তিগুলি যখন ঘটে তখন প্রায়শই 2 থেকে 3 ফাংশন সর্বাধিক সম্পাদিত হয়। স্কালার মতো একসাথে বেঁধে রাখা কখনও কখনও বেশ কয়েকটি ফাংশন নেই।

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


5
এটি হয় না - এবং এটি যদি হয় তবে এটি কেন সমস্যা হবে তা দেখতে আমি ব্যর্থ।
কিথ থমসন

1
আমি ভেবেছি এটা করেছে। স্কালায় এমন কোনও মামলা রয়েছে যেখানে কোনও ফাংশনের জন্য রিটার্নের ধরণটি আসলে অস্পষ্ট?
আবর্জনা সংগ্রহ

উত্তর:


15

স্কালার জন্য সমস্ত ফাংশনগুলিতে সুস্পষ্ট রিটার্ন টাইপের দরকার হয় না , কেবল পুনরাবৃত্তিযোগ্যগুলি। এর কারণ হ'ল স্কালার ধরণের ইনফারেন্স অ্যালগরিদম হল (কাছাকাছি কিছু) একটি সাধারণ স্ক্যান শুরু থেকে শেষ পর্যন্ত যা লুকোহেড অক্ষম।

এর অর্থ এই যে একটি ফাংশন:

def fortuneCookieJoke(message: String) = message + " in bed."

কোনও রিটার্ন টাইপের দরকার নেই, যেহেতু স্কালার সংকলকটি লজিক ভেরিয়েবলগুলি ব্যবহার না করে বা পদ্ধতির পরামিতিগুলি ছাড়া অন্য কোনও কিছু না দেখে স্পষ্টভাবে দেখতে পারে, যে রিটার্নের ধরণ অবশ্যই হবে String

অন্যদিকে, এর মতো একটি কার্য:

def mapInts(f: (Int) => Int, l: List[Int]) = l match {
  case Nil => Nil
  case x :: xs => f(x) :: mapInts(f, xs)
}

একটি সংকলন-সময় ত্রুটির কারণ ঘটায়, কারণ স্কালা সংকলক দেখতে না পেয়ে দেখতে পারে, না লুকেহেড বা লজিক ভেরিয়েবল ব্যবহার না করে, ঠিক কী ধরনের mapIntsতা। সর্বাধিক এটি বলতে পারে, যদি এটি যথেষ্ট স্মার্ট হয় তবে তা হ'ল রিটার্ন টাইপটি একটি সুপার টাইপ List[Nothing], যেহেতু Nilসেই ধরণের। রিটার্নের ধরণটি সঠিকভাবে নির্ধারণ করার জন্য এটি পর্যাপ্ত তথ্যের কাছাকাছি কোথাও দেয় না mapInts

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


4
আসলে, সমস্যাটি এত বেশি বিস্তৃত ধরণের ইনফারেন্সিং অ্যালগরিদম খুঁজে বের করার মতো নয়। বর্তমান স্কেলা সংকলকটিতে ত্রুটি বার্তাগুলির উচ্চ মানের রাখার সময় এটি আরও বিস্তৃত প্রকারের ইনফারেন্সিং অ্যালগরিদম নির্ধারণ করে ।
Jörg ডব্লু মিট্টাগ

1
case Nilসত্যিকারের জন্য সঠিক রিটার্নটি List[Int]()কি খালি হবে না ? কোন ক্ষেত্রে পর্যাপ্ত স্মার্ট সংকলক এটি বের করতে পারে। আমি মনে করি, এগুলি সবই শয়তানের অ্যাডভোকেটকে খেলে।
কেচালোক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.