
Eugeny
04.10.2018
10:39:24
Я посмотрел вчера reactive чтототам лайбари от Елизарова, но там было преобразование корутин в моно и флюкс, но не наоборот
А вот каналы похоже на то, гляну

Andrey
04.10.2018
10:40:08
Не совсем. Если вы используете имплиситы, то у вас по-прежнему ограниченное количество типов, для которых имплиситы существуют и ограниченный контекст, в пределах которого вы можете ссылаться на эти имплиситы
Да, типы остаются, только вот они остаются в виде: "верь мне, компилятор, я инженер". В скале это не так заметно, а если включить имплиситы в Haskell - сразу становится понятно, что без явного указания сигнатур они не работают, но компилируются => компилятор не способен корректно типы вывести и эта обязанность ложится на человека.
Проблема с имплиситами в том, что во многих случаях компилятор не способен сам вывести, какой из них надо использовать, и берёт какой-то, подходящий по тому, что он вывел для типа, притом вывел, скорее всего, не верно.

Google

Alexandr
04.10.2018
10:43:27

Egor
04.10.2018
10:45:46
Проблема с имплиситами в том, что во многих случаях компилятор не способен сам вывести, какой из них надо использовать, и берёт какой-то, подходящий по тому, что он вывел для типа, притом вывел, скорее всего, не верно.
Ну, это странно, там на самом деле довольно жестко типы указываются. То, что прилетает в функцию с имплиситом и то, для каких типов имплисит определен - этого должно вполне хватать, чтобы правильно вывести тип

Andrey
04.10.2018
10:45:47
Импилситы (динамическое связывание) можно проверить на корректность только в рантайм, да и то не всегда.
В Haskell, если сигнатура имплисита не указана - всё компилируется, только функции с имплиситами дают неверные результаты.

Andrew
04.10.2018
10:46:41

Andrey
04.10.2018
10:48:14
Ну, это странно, там на самом деле довольно жестко типы указываются. То, что прилетает в функцию с имплиситом и то, для каких типов имплисит определен - этого должно вполне хватать, чтобы правильно вывести тип
Подробнее надо копать в причинах. Я посмотрел примеры в доке Хаскеля по имплиситам, как оно может косячить, с объяснениями, но времени на свои эксперименты, чтобы "прочувствовать боль", не было.

Eugeny
04.10.2018
10:48:43

Andrey
04.10.2018
10:49:00
Понял только по примерам, что боль есть и надо сильно думать, прежде чем использовать, на тему: "а оно тебе надо?"

dimiii
04.10.2018
10:53:21
Так какое резюме? Имплиситы убрать, PoC переписать? Потому что я помню в KEEP-87 обсуждались разные подходы.

Egor
04.10.2018
10:57:36
Я думаю, что если в Котлине все-таки будут делать имплиситы, то сначала сделают к ним качественную систему типов
имплиситы - в том виде, в котором они есть в Скале и в том виде, как они представлены в KEEP-87, через with

Alexey
04.10.2018
10:58:12


Andrey
04.10.2018
11:02:31
Возможно это проблема исключительно хаскеля, потому что в scala если есть несколько вариантов, то компиляция не проходит, если компиляция прошла, то значит всё будет ок
Да, в том виде, как я описал, она специфична для Хаскеля, так как он очень редко требует явного указания типа чего-либо. Выводится всё, включая типы параметров функции.
При этом для имплиситов оно выводится не верно, что вскрывает более глубокую проблему: автоматическая проверка корректности не возможна для имплиситов, нужно руками подсказывать типы компилятору.
В Скале чаще надо подсказывать типы компилятору, но это не избавляет от проблемы: компилятор проверит подсказки как сможет, посчитает, что всё ок, но подсказки не верные.
Если компилятор сам может точно вывести, какие сигнатуры верные, а какие нет - он сам их выведет и нет нужды в подсказках. Если подсказки нужны, значит не известен способ вывести типы корректно, а значит, человек в подсказках тоже может ошибиться (наши способности к логическому выводу в среднем хуже чем у автоматических систем).

Google

Andrey
04.10.2018
11:07:46
Система типов для имплиситов вместо безопасности даёт иллюзию безопасности. Вот в чём проблема.

Igor
04.10.2018
11:33:46
Зачем там вообще имплиситы, если есть тайпклассы? (которые по идеи уникальны)
Ну и как бы с котлином все так надо скалу сравнимать, тк ни там ни там нет Х-М

G_Dee
04.10.2018
11:40:06
Кто использует Kotlin/JS, использовали с Node.JS? Расскажите как оно))

1337
04.10.2018
11:44:52
и заодно с ангуляром

eshch
04.10.2018
11:44:52

Anna
04.10.2018
11:56:41
Ну, у меня работает хелоуворлдный сервер на Node.js + Express + MongoDB
Я осилила, при том, что в веб программировании совершенно не рублю и JS тоже не знаю. Но я смогла только из большой любви к Котлину ?♀️

Alexandr
04.10.2018
11:59:43
чисто что бы сказть "я так умею"?

Quantum Harmonizer
04.10.2018
12:00:08

Alexandr
04.10.2018
12:00:23

Anna
04.10.2018
12:00:26

Alexandr
04.10.2018
12:00:28
фразу портишь

Anna
04.10.2018
12:01:02
Не для прода, ясен пень

Mikhail
04.10.2018
12:03:22

Alexander
04.10.2018
12:23:04
Я нодой зависимости подтягивал через kotlin-frontend. После мавена смотрится абсолютно убого, но это проблема ноды а не котлины.

Igor
04.10.2018
12:24:47
Но зато в ноде есть ^ ? (крышечки)

Roman
04.10.2018
12:26:07
Да... это точно ... с нодой всем крышка ...

Leonid
04.10.2018
12:27:00
Разве в гредле нет? Плюсик точно был

Google

Alexander
04.10.2018
12:28:28
Проблема не в крышках, а в глобальной мусорке и невозможности подтянуть библиотеку при сборке (ноде сборки как таковой нет, только webpack, который тоже страшен как низнамо что).
Я думаю что только за нормальную сборку kotlin-js можно памятник поставить.

Anna
04.10.2018
12:30:04

Alexander
04.10.2018
12:32:07
У меня все работало., но у меня не было серверной части, только собственно frontend
Серверную часть писать на JS при живом кторе - это какой-то изврат

Anna
04.10.2018
12:33:09

Alexander
04.10.2018
12:33:50
Фактор окружения - это косяк ноды. Я думаю, что он не лечится. Собирать только на одном конкретном компьютере и не дышать.

Quantum Harmonizer
04.10.2018
12:33:58

Alexander
04.10.2018
12:34:27
Я имею в виду если и так в котлиновской экосистеме.

Anna
04.10.2018
12:34:54

Alexander
04.10.2018
12:35:10
да. авторелоад работал.
Там куча бойлерплейта для этого хот релоада, я его не понимаю, но просто тупо скопировал из премера в kotlin-frontend. Магия

Anna
04.10.2018
12:36:34

Alexander
04.10.2018
12:36:39
а
Значит наверное нет. У меня двух-платформенный проект, тесты все на JVM гонял

Anna
04.10.2018
12:44:01
У меня тоже магически всё работало, пока я не попыталась тесты добавить или задеплоить. Ну, штука хорошая, но пока похоже не все возможности гладко работают, а если что-то не так, то я не нашла способа быстро разобраться (именно потому, что всё магически и как-то неявно работает и само настраивается)

Alexander
04.10.2018
12:45:34
Я думаю, что ключевая проблема в том, что в JS нет понятия компиляции и сборки. Там вообще все происходит в рантайме. В котлин/градл наоборот все кроме непосредственно исполнения вынесено в сборку. Конфликт идеологий.

Anna
04.10.2018
12:46:46
Да, скорее всего. С JS экосистемой полюбому сложнее подружиться

Vladislav
04.10.2018
12:58:17
А как сделать экстеншн для самого класса? Чтобы можно было сделать так:
MyClass.extensionCall()

Костя
04.10.2018
12:58:54
для класса ?

Google

Vladislav
04.10.2018
12:58:56
Пытаюсь сделать экстеншн к классу так:
inline fun <reified T: Class<*>> T.getLogger() = LoggerFactory.getLogger(T::class.java)
ага для класса
Оно вроде бы компилится, но позвать его не получается
в смысле на объявление такого экстеншена не ругается, а вот позвать не дает от класса

Mi
04.10.2018
13:02:52
хочешь сделать экстеншен к компаньону?

Andrew
04.10.2018
13:02:56
Если компаньон есть, то fun MyClass.Companion.getLogger() = .... Если это generic, даже reified, то никак, ибо компаньона может не быть.

Vladislav
04.10.2018
13:03:17

Andrew
04.10.2018
13:03:39
Да, к Java-классам экстеншны писать не получится.

Admin
ERROR: S client not available

Vladislav
04.10.2018
13:03:51
Вообще в итоге я хотел так сделать:
val logger = MyCoolClass.logger
чтобы не писать так:
val logger = LoggerFactory.getLogger(MyCoolClass::java.class)

Mi
04.10.2018
13:06:12
почему бы не передавать хотя бы this в подобного рода функцию?
ещё как вариант можно подключить одну из десятка обёрток для котлина

Oleg
04.10.2018
13:08:03

Mi
04.10.2018
13:08:14
только хотел скинуть

Andrey
04.10.2018
13:09:06
Или так:
class C
val KClass<*>.logger
get() = LoggerFactory.getLogger(this.java)
fun main(args: Array<String>) {
C::class.logger
}
Без ::class не получится, так как <имя_класса>.<идентификатор> - это обращение к идентификаторам, объявленным в компаньоне.
Экстеншен на компаньон произвольного класса сделать не получится, так как у класса может не быть компаньона.

Igor
04.10.2018
13:17:26

Google

ISkylake
04.10.2018
13:21:58
Кому обновление плагина на 1.3 прилетело?

Sergey
04.10.2018
13:23:05

dimiii
04.10.2018
13:24:43
Все равно, LoggerFactor.getLogger(class) использует LoggerFactor.getLogger(String)

Andrey
04.10.2018
13:26:06

dimiii
04.10.2018
13:27:41

Andrey
04.10.2018
13:29:35

Vladislav
04.10.2018
13:29:40

Egor
04.10.2018
13:30:30
Зачем там reified дженерик?

Vladislav
04.10.2018
13:32:20
Ну я пробовал и KClass, ну в общем без ::class я так понял, что не обойтись

Egor
04.10.2018
13:33:32
а, понял

Beholder
04.10.2018
13:46:49
inline fun <reified T> getLogger() = Logger.getLogger(T::class.java.name)
такой вариант уже был? :)

Andrey
04.10.2018
13:49:01

Beholder
04.10.2018
13:49:59
Давно хочу спросить, зачем группе логотип с этим чайником?

Андрей
04.10.2018
13:52:01
сгвспотсвуоао

Andrew
04.10.2018
13:52:02
Это же раритет
Первый логотип?!
Если не ошибаюсь

Oleg
04.10.2018
13:53:32

Beholder
04.10.2018
13:54:10
Ну не ассоциируется сейчас же