Оба ваших List
примера компилируются, но они не означают одно и то же и не дают одинаковых результатов.
e.map(i => List(i2s(i))) //res0: scala.util.Either[String,List[String]] = Right(List(10))
e.map(List(i2s(_))) //java.lang.IndexOutOfBoundsException: 10
Первый легко понять, так что же происходит со вторым?
Что происходит, так это то, что вы используете eta extension для создания Int => String
функции из метода i2s()
. Затем вы заполняете List
этой единственной функцией в качестве единственного элемента в списке, а затем пытаетесь получить значение по индексу 10
, которое не существует, и, следовательно, исключение.
Если вы измените 1-ю строку на val e = 0.asRight[String]
, то исключение исчезнет, потому что что-то действительно существует с индексом 0
, функцией, которую только что поместили туда.
Компилируется, потому что экземпляр List
будет принимать Int
в качестве параметра (через скрытый метод apply()
), но экземпляр Option
не имеет метода apply()
это занимает Int
(*), поэтому не может быть скомпилировано.
(*) У объекта Option
есть метод apply()
, но это другое животное.