@kotlin_lang

Страница 709 из 982
1337
15.06.2018
09:10:52
(к вопросу про релиз)

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

Y
15.06.2018
09:11:10
ой, действительно :)
разобрался, этот Function0<T>

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

Google
Kirill
15.06.2018
09:11:45
разобрался, этот Function0<T>
я слишком давно не писал на джаве и забыл как там это делается

1337
15.06.2018
09:12:53
разобрался, этот Function0<T>
крутой постфикс 0

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
?

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)

Ну полная же дичь

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
ни разу не видел тайпалиас в коде
Удалить нахер из языка!111

1337
15.06.2018
09:21:54
Удалить нахер из языка!111
только после рекурсий

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
Nameless
15.06.2018
09:41:25
> OnCompleteInterface > OnFailInterface сложно придумать названия хуже
другими словами: так я ничего не называю в коде, тут просто для примера

Google
Никита?❄️
15.06.2018
10:25:30
@Harmonizr
о, привет

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

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

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

dimiii
15.06.2018
10:58:10
Его и делают, только назвали инлайн классом с расчётом на то, что в будущем, возможно, можно будет больше одного свойства в них делать.
Моя мечта - чтобы вместе с контрактами, тайпклассами и inline-что-там-они-еще-придумают-с-инлайном запилили что-то вроде liquidhaskell для промышленного разработчика.

Ну и чтобы контракты были не просто припаркой к 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?

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, т/е все то же.

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 это, похоже, не сильно нужно.

Andrey
15.06.2018
16:45:16
<R> Stream<R> map(Function<? super T, ? extends R> mapper); вот для этого в доке прям с примером
Ок. А где в доке примеры, рассказывающие, почему в коде: typealias F<A, B> = (A) -> B fun main(args: Array<String>) { val f: F<in Double, out Number> = { it } val f2: (in Double) -> out Number } строчка val f компилируется, а следующая за ней - нет? С точки зрения алиасинга типов, эти две строчки - одно и то же

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
inline alias потому что еще не написали. (шутка)
Так алиасов вообще после компиляции не существует, впрочем как и генериков, и вариантностей :)

Bogdan
15.06.2018
16:51:50
inline alias потому что еще не написали. (шутка)
тайп аляс как раз просто заменять то что справа, на о что слева

по ситу инлайн)

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. Очень удивило многообразие непонятно названных функций с непонятным назначением и совершенно без малейшего описания. Так и планируется оставить? Или пока он не зарелизится, будет ходить с кишками наружу?

Страница 709 из 982