
1337
15.06.2018
09:10:52
(к вопросу про релиз)

Alexey
15.06.2018
09:10:55
sam в котлин интерфейсы не завезли

Y
15.06.2018
09:11:10

1337
15.06.2018
09:11:17
функциональные или какие?

Google

Kirill
15.06.2018
09:11:45

1337
15.06.2018
09:12:53

Alexey
15.06.2018
09:13:24
У меня переодически горит от дововод почему sam не нужен в котлине, и что его можно заменить на typealias. Но при этом typealias не существует в рантайме, да и в компайлтайме компилятор тоже не рассматривает алиасы как самостоятельные типы

1337
15.06.2018
09:14:22
можно пример typealias?

Alexey
15.06.2018
09:14:59
typealias SomeShitSupplier = () => SomeShit

1337
15.06.2018
09:15:46
обязательно в переменную присваивать?

Alexey
15.06.2018
09:16:31
?

Nameless
15.06.2018
09:16:38

1337
15.06.2018
09:16:42
а в чем их довод?
сразу лямбдой же более секси

Nameless
15.06.2018
09:17:07
это тоже удивило что функциональные классы лямбдочкой не закрыть

Alexey
15.06.2018
09:17:28
Ну типо нахера объявлять
interface SomeShitSupplier {
fun supply(): SomeShit
}
когда можно сделать алиас

Nameless
15.06.2018
09:18:38
а почему бы две возможности не оставить

Google

Alexey
15.06.2018
09:19:08
Но при этом компилятор не говорит что ты написал херню вроде:
typealias Foo = Int
typealias Bar = Int
fun fooProcessing(foo: Foo)
val bar: Bar = 1
fooProcessing(bar)
Ну полная же дичь

dimiii
15.06.2018
09:19:58

Alexey
15.06.2018
09:20:20
Вот и я о том же

dimiii
15.06.2018
09:20:22
А может и горит и скоро потушат

Alexey
15.06.2018
09:20:38
Да кого там

1337
15.06.2018
09:21:07
ни разу не видел тайпалиас в коде
видимо слишком advanced

Alexey
15.06.2018
09:21:26

1337
15.06.2018
09:21:54

Alexey
15.06.2018
09:22:12
Но вообще да не понятно, на кой нужен typealias без путизависимых типов

1337
15.06.2018
09:22:46
я думал он просто для читаемочти
типа define в си

Nameless
15.06.2018
09:29:01
Но вообще да не понятно, на кой нужен typealias без путизависимых типов
ну да получается в случае функциональных интерфейсов мы объявляем два интерфейса
OnCompleteInterface{
onComplete()
}
OnFailInterface{
onFail()
}
присваеваем их в переменные, жанглируем ими и не можем перепутать когда отправляем как callback куда-нибудь
а в случае typealiases мы можем перепутать и отправлять onFail в onComplete так как типы будут одинаковые () -> Unit
правильно?

Dmitrii
15.06.2018
09:29:31
правильно жОнглируем

Alexey
15.06.2018
09:30:27

Quantum Harmonizer
15.06.2018
09:37:41

Nameless
15.06.2018
09:41:25

Google

Никита?❄️
15.06.2018
10:25:30

Artyom
15.06.2018
10:50:35
Драсте

Andrew
15.06.2018
10:50:42
Дык грозятся в скором времени инлайн классы с одним полем завезти, которые как раз будут типизированным вариантом тайпалиаса.

dimiii
15.06.2018
10:54:12

Andrew
15.06.2018
10:55:57
Звучит как newtype
Его и делают, только назвали инлайн классом с расчётом на то, что в будущем, возможно, можно будет больше одного свойства в них делать.

dimiii
15.06.2018
10:58:10
Ну и чтобы контракты были не просто припаркой к IDE, а чем-то мощным, основанным на какой-нибудь продвинутой логике

OlegKrikun
15.06.2018
11:03:07

Andrew
15.06.2018
11:04:54
Я сомневаюсь, потому что AA -- не дженерик.

Алексей
15.06.2018
11:11:39
Где можно подписаться на новости котлина?
кроме твиттера

Igor
15.06.2018
13:16:28
https://t.me/TheDailyKotlin

Алексей
15.06.2018
13:17:46
спасибо

Andrey
15.06.2018
15:23:09
Добрый день. Вопрос скорее теоретический:
Есть у меня желание объявить в Kotlin предикат always, который для любого входного параметра возвращает true.
Пока получилось только так:
typealias P<A> = (A) -> Boolean
val always: P<*> = { _ -> true }
Есть ли возможность сделать то же самое, но без танцев с typealias?
Как-нибудь можно написать сигнатуру (*) -> Boolean?

Dibro
15.06.2018
15:25:21


Andrey
15.06.2018
16:23:43
val always = { _: Any? -> true }
Да, для данного частного случая это примерно одно и то же, хотя тип у { _: Any? -> true } будет (Any?) -> Boolean, а не (*) -> Boolean
Более общий вопрос заключается в том, как быть с вариантностью in и out для сигнатур функциональных типов.
В Java можно объявить такую конструкцию:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
то есть map принимает на вход функцию, контрвариантную по своему параметру и ковариантную по результату.
В Kotlin функции, передаваемые в map инвариантны:
public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R>
Хотя похоже, что в Kotlin сами функциональные типы контрвариантны по своим параметрам и ковариантны по результату.
Иначе я не могу понять, почему компилируется вот этот код:
fun main(args: Array<String>) {
fun test(f: (Double) -> Number): Nothing = TODO()
val f: (Number) -> Double = Number::toDouble
test(f)
}


dimiii
15.06.2018
16:31:41
Да, для данного частного случая это примерно одно и то же, хотя тип у { _: Any? -> true } будет (Any?) -> Boolean, а не (*) -> Boolean
Более общий вопрос заключается в том, как быть с вариантностью in и out для сигнатур функциональных типов.
В Java можно объявить такую конструкцию:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
то есть map принимает на вход функцию, контрвариантную по своему параметру и ковариантную по результату.
В Kotlin функции, передаваемые в map инвариантны:
public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R>
Хотя похоже, что в Kotlin сами функциональные типы контрвариантны по своим параметрам и ковариантны по результату.
Иначе я не могу понять, почему компилируется вот этот код:
fun main(args: Array<String>) {
fun test(f: (Double) -> Number): Nothing = TODO()
val f: (Number) -> Double = Number::toDouble
test(f)
}
Так * - означает не кванитифицированный тип, т/е ограниченный Object сверху, т/е считай тем же Any, Any? если учитывать null, т/е все то же.
Да, для данного частного случая это примерно одно и то же, хотя тип у { _: Any? -> true } будет (Any?) -> Boolean, а не (*) -> Boolean
Более общий вопрос заключается в том, как быть с вариантностью in и out для сигнатур функциональных типов.
В Java можно объявить такую конструкцию:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
то есть map принимает на вход функцию, контрвариантную по своему параметру и ковариантную по результату.
В Kotlin функции, передаваемые в map инвариантны:
public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R>
Хотя похоже, что в Kotlin сами функциональные типы контрвариантны по своим параметрам и ковариантны по результату.
Иначе я не могу понять, почему компилируется вот этот код:
fun main(args: Array<String>) {
fun test(f: (Double) -> Number): Nothing = TODO()
val f: (Number) -> Double = Number::toDouble
test(f)
}
Используются модификаторы out/in для ко/контр-вариативности


Bogdan
15.06.2018
16:33:28
и доку прочитай

Google


dimiii
15.06.2018
16:36:22
Да, для данного частного случая это примерно одно и то же, хотя тип у { _: Any? -> true } будет (Any?) -> Boolean, а не (*) -> Boolean
Более общий вопрос заключается в том, как быть с вариантностью in и out для сигнатур функциональных типов.
В Java можно объявить такую конструкцию:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
то есть map принимает на вход функцию, контрвариантную по своему параметру и ковариантную по результату.
В Kotlin функции, передаваемые в map инвариантны:
public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R>
Хотя похоже, что в Kotlin сами функциональные типы контрвариантны по своим параметрам и ковариантны по результату.
Иначе я не могу понять, почему компилируется вот этот код:
fun main(args: Array<String>) {
fun test(f: (Double) -> Number): Nothing = TODO()
val f: (Number) -> Double = Number::toDouble
test(f)
}
Хм, удивительное рядом, ты прав, эти модификаторы можно использовать только при описании классов/интерфейсов.


Andrey
15.06.2018
16:39:41
и доку прочитай
Так потому здесь и спрашиваю, что в доке не нашёл, как использовать * и ко/контрвариантность в сигнатурах функциональных типов.
Хотя эксперименты показали, что в Kotlin это, похоже, не сильно нужно.

Bogdan
15.06.2018
16:40:53
также можешь вставить джава код в котлин файл, должен сконвертироватся, код не самый лучшый правда

Andrey
15.06.2018
16:45:16

Bogdan
15.06.2018
16:46:10
тут вроде ошибка синтаксиса
ин и оут при обявлени, тоесть где ваш тайп аляс
val f: F<in Double, out Number> = { it }
тут ты явно задаешь тип F<in Double, out Number>

Andrey
15.06.2018
16:48:09
тут вроде ошибка синтаксиса
Понятно, что ошибка синтаксиса. Вопрос в том, почему синтаксис не гомогенный, и для алиаса я могу задать вариантность, а для типа, алиасом которого он является, нет.

Boris
15.06.2018
16:49:37
Синтаксис декларации функции более бедный просто
Хотя и не понятно до конца почему

dimiii
15.06.2018
16:50:36
inline alias потому что еще не написали. (шутка)

Bogdan
15.06.2018
16:50:43
соглашусь с вами Andrey @fogone

Andrey
15.06.2018
16:51:32

Bogdan
15.06.2018
16:51:50
по ситу инлайн)

Google

Boris
15.06.2018
16:53:19

Антон
15.06.2018
16:58:10
https://store.raywenderlich.com/products/kotlin-apprentice нашел такую книгу ?
че как она


Dmitry
15.06.2018
21:26:25
Понятно, что ошибка синтаксиса. Вопрос в том, почему синтаксис не гомогенный, и для алиаса я могу задать вариантность, а для типа, алиасом которого он является, нет.
В случае с обычными типами, use-site variance может только повторять declaration-site (но на это есть инспекция), если он ему противоречит -- это ошибка компиляции:
class F<in T, out R>
val redundant: F<in Double, out Number> // Projection is redundant: the corresponding type parameter of F has the same variance
val bad: F<out Double, in Number> // Projection is conflicting with variance of the corresponding type parameter of FooА в функциональных типах действительно уже "прибита" declaration-site variance. Т.е. (T) -> R это с точки зрения вариантности F<in T, out R>
Соответственно, use-site variance для них не имеет смысла: она или повторяет declaration-site (и тогда это просто излишний код), либо противоречит ей (и тогда это ошибка). Поэтому разрешать in/out на аргументах функциональных типов нет никакого смысла, проще запретить, чтобы не путать людей.


Жабра
16.06.2018
11:38:07
Щас залез, скачал clion, захотел потыкать kotlin/native. Очень удивило многообразие непонятно названных функций с непонятным назначением и совершенно без малейшего описания. Так и планируется оставить? Или пока он не зарелизится, будет ходить с кишками наружу?

Vadim
16.06.2018
14:00:47