উত্তর:
scala> println (Nil == List())
true
scala> println (Nil eq List())
true
scala> println (Nil equals List())
true
scala> System.identityHashCode(Nil)
374527572
scala> System.identityHashCode(List())
374527572
নিল আরও মূর্খবাদী এবং বেশিরভাগ ক্ষেত্রেই এটি পছন্দ করা যায়। প্রশ্ন?
List[A]()(যদিও Nil) foldLeft জন্য একটি সঁচায়ক মান হিসাবে প্রয়োজনীয়? উদাহরণ - এখানে সংগ্রহকারী হিসাবে scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)ব্যবহার Nilকরা কার্যকর হবে না।
Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
ব্যবহারকারীর অজানা দেখিয়েছে যে উভয়ের রান সময় মান Nilএবং List()একই। তবে তাদের স্থিতিশীল প্রকারটি নয়:
scala> val x = List()
x: List[Nothing] = List()
scala> val y = Nil
y: scala.collection.immutable.Nil.type = List()
scala> def cmpTypes[A, B](a: A, b: B)(implicit ev: A =:= B = null) = if (ev eq null) false else true
cmpTypes: [A, B](a: A, b: B)(implicit ev: =:=[A,B])Boolean
scala> cmpTypes(x, y)
res0: Boolean = false
scala> cmpTypes(x, x)
res1: Boolean = true
scala> cmpTypes(y, y)
res2: Boolean = true
এটি কোনও বিশেষত গুরুত্ব দেয় যখন এটি কোনও ধরণের অনুমান করতে ব্যবহৃত হয়, যেমন কোনও ভাঁড়ার সঞ্চয়ের ক্ষেত্রে:
scala> List(1, 2, 3).foldLeft(List[Int]())((x, y) => y :: x)
res6: List[Int] = List(3, 2, 1)
scala> List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
^
y :: x না হবে। সমস্যাটি হ'ল এটি যে ধরণের প্রত্যাশায় প্রত্যাশিত প্রকার নয়। এটি প্রত্যাবর্তন করে List[Int], প্রত্যাশিত প্রকারটি হয় হয় List[Nothing]অথবা Nil.type(আমার মনে হয় পূর্ববর্তী, তবে সম্ভবত পরে)।
ব্যবহারকারী অজানা এর উত্তর দেখায়, তারা একই জিনিস।
আইডোমেটিকভাবে নীলকে পছন্দ করা উচিত কারণ এটি দুর্দান্ত এবং সংক্ষিপ্ত। যদিও এর ব্যতিক্রম আছে: যদি আমি মনে করি কোনও কারণেই যদি একটি সুস্পষ্ট ধরণের প্রয়োজন হয়
List[Foo]()
চেয়ে ভাল হয়
Nil : List[Foo]
List.empty[Foo]তৃতীয় বিকল্প হিসাবে আছে ।
Nilএটি আরও মূর্খ।