Почему переходники должны быть явно принудительными, когда вы определяете потоки в Scala?

Я читаю учебник Scala о потоках

sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]

В учебнике написано

«Из-за технических ограничений, это переходники, которые должны быть явно принудительно заданы, а не параметры по имени».

Я полагаю, в учебнике имеется в виду, что h: ()=>A, t: ()=>Stream[A] не следует заменять на h: =>A, t: =>Stream[A]. Но какие так называемые «технические ограничения» это запрещают?


person zell    schedule 15.02.2018    source источник


Ответы (1)


Но какие так называемые «технические ограничения» это запрещают?

Технические ограничения заключаются в том, что в настоящее время (начиная со Scala 2.12.x) Scala не поддерживает lazy val параметры или параметры по именам в кейс-классах.

Почему? Из-за того, что классы прецедентов получают автоматические реализации методов, полученные для них компилятором, такие как, например, equals и hashCode, которые вычисляются на основе значений классов прецедентов. Как можно вычислить значение hashCode, скажем, для бесконечного потока?

Более полный ответ о том, почему классы case не могут иметь параметры по имени, можно найти по адресу Класс Scala запрещает вызов параметров по имени?

person Yuval Itzchakov    schedule 15.02.2018