@kotlin_lang

Страница 904 из 982
Timophei
03.10.2018
11:04:11
Прекращайте, ребят.
Ты чего, в этом канале срач это основное

Nikita
03.10.2018
11:04:39
Превратить котлин в скалу - плохая идея

OlegKrikun
03.10.2018
11:04:44
Срачи сюда https://t.me/pofftop

Igor
03.10.2018
11:04:48
@pofftop (сейчас как удалим все ?)

Google
Сергей
03.10.2018
11:05:17
Создайте чат @fp_jvm и туда всех?

Nameless
03.10.2018
11:05:30
Egor
03.10.2018
11:05:38
Превратить котлин в скалу - плохая идея
так уже поздно. Гораздо лучше идея - сделать из котлина нормальное фп+ооп

Nameless
03.10.2018
11:05:49
И там обсуждения как здорово без циклов а 2к18 (кек)

Nikita
03.10.2018
11:06:34
Пытаются

Там POC тайпклассов в котлине выкатили https://github.com/arrow-kt/kotlin/pull/6

Andrew
03.10.2018
11:06:39
так уже поздно. Гораздо лучше идея - сделать из котлина нормальное фп+ооп
Если под "нормальным фп" подразумевается "сделать так, чтобы хорошо жилось любителям эрроу" — не надо, пожалуйста.

Egor
03.10.2018
11:07:01
@fp_jvm погнали, пацаны

Andrew
03.10.2018
11:07:01
Ибо им-то хорошо житься будет, а всем остальным резко станет грустно.

Google
Mikhail
03.10.2018
11:08:01
типоклассы вполне себе оопешная штука, это просто адаптер для интерфейса

Mikhail
03.10.2018
11:08:37
никто ведь не протестует против дополнительной поддержки паттерна делегации в котлине

Alexandr
03.10.2018
11:08:57
Там POC тайпклассов в котлине выкатили https://github.com/arrow-kt/kotlin/pull/6
если честно - то я мало что понял, надо вчитываться

Я больше про имплиситы
не нужны! упаси боже)

Nikita
03.10.2018
11:10:27


Alexandr
03.10.2018
11:14:28
а, вот про имплиситы сразу не увидел

вон отсюда arrow)

Kirill
03.10.2018
11:14:55
Там POC тайпклассов в котлине выкатили https://github.com/arrow-kt/kotlin/pull/6
тащемта (не костыльной) реализации тайпклассов в скале нет. ждём дотти

У скалистов вроде припекает от котлина они на нем не пишут(вроде бы)
я скалист, от котлина не припекает (только от некоторых недопилов)

Alexey
03.10.2018
11:17:43
тащемта (не костыльной) реализации тайпклассов в скале нет. ждём дотти
А чем дотти будет принципиально отличаться в этом плане?

Kirill
03.10.2018
11:19:22
Синтаксисом криваярожажпг

Alexey
03.10.2018
11:20:09
когерентностью жи
не помню чтобы когерентность обещали

Alexey
03.10.2018
11:26:56
Исключение?
Да как бы у скалистов вообще не печёт от котлина

Celt
03.10.2018
11:37:33


Andrey
03.10.2018
11:37:43
Не, ну погодите. Тайп классы - это тайп классы. Имплиситы - это имплиситы. Не надо мух с котлетами смешивать. Тайп классы про реализацию контрактов по месту. Есть у тебя контракт (интерфейс, он же тайп класс) A, есть класс B. Ты описываешь, как классом B реализуется контракт A и можешь везде, где требуется A использовать B. При этом декларацию класса B ты не модифицируешь. Имплиситы про динамическое связывание свободных переменных в лямбдах (подробнее не скажу, ещё не копал особо эту тему в haskell, так как там она в рамках language extension сделана).

Google
Andrey
03.10.2018
11:46:05
т.е. неявно (implicitly) вместо B подставляется реализация контракта A для B
Не вижу здесь какой-то неявности в подстановке реализации. Две реализации B => A в рамках одного пространства имён существовать не может, это компилятор проверяет. В результате мы всегда легко отслеживаем единственную реализацию.

Kirill
03.10.2018
11:48:09
у тебя нет _явной_ функции из тайпкласса D на объекте класса C

и тем более ты нигде _явно_ не прописываешь что для вызова этой функции ты используешь конкретный инстанс тайпкласса

Andrey
03.10.2018
11:51:25
у тебя нет _явной_ функции из тайпкласса D на объекте класса C
Так её и неявной нету. Это даункаст из D в C получается. Есть явная стрелка из C в D, а не наоборот.

Ты же на вызове используешь конкретный инстанс с конкретным типом, которому соответствует конкретный инстанс тайп класса.

Kirill
03.10.2018
11:53:44
нет

у тебя просто "появляется" метод на классе A из тайпкласса B

Andrey
03.10.2018
11:55:15
у тебя просто "появляется" метод на классе A из тайпкласса B
Ну как же он просто появляется, если ты его декларируешь в описании реализации A => B

Andrey
03.10.2018
11:56:08
Он не из ниоткуда магически "появляется". Он из вполне конкретной и единственной декларации появляется.

Kirill
03.10.2018
11:56:49
ты его декларируешь в тайпклассе и реализуешь в каком-то инстансе не понятно где

ну и: myClassInstance.methodFromTypeClass() // не явно with(typeClassInstance) { myClassInstance.methodFromTypeClass() } // явно

Andrey
03.10.2018
12:09:18
ты его декларируешь в тайпклассе и реализуешь в каком-то инстансе не понятно где
Вот есть у нас такой примерно псевдокод с типичным использованием тайп классов (это не код на Kotlin): typeclass A { fun foo(): String } .... instance A(B) { override fun foo(): String = "foo" } ... fun A.printFoo() = println(foo()) ... val b: B = ... b.printFoo() Не пойму, где тут неявность?

Декларация instance A(B) у нас единственная, это компилятор вполне может проверить.

Kirill
03.10.2018
12:24:53
неявность в том что ты ЯВНО не указываешь что printFoo у теья от тайпкласса и тем более не указываешь инстанс

extension функции внезапно тоже не явные

Andrey
03.10.2018
12:27:17
неявность в том что ты ЯВНО не указываешь что printFoo у теья от тайпкласса и тем более не указываешь инстанс
Ну так у нас любой подключенный класс из внешней библиотеки можно считать неявным. У тебя "из ниоткуда" появляются конструкторы класса, и вообще возможность с ним работать.

Google
Kirill
03.10.2018
12:27:50
тогда иплиситы в скале - явные

это пожалуй всё что я могу на эту тему ещё написать

Andrey
03.10.2018
12:31:26
тогда иплиситы в скале - явные
Нет. Имплиситы как раз неявные, так как описывают, какой конкретный инстанс использовать по умолчанию вместо тайп класса. А в моём примере выше имплиситов и прочих дефолтов нет. Неявным он станет, если написать default A = b ... printFoo() Вот тут уже для printFoo ресисвер определяется неявно.

Andrey
03.10.2018
12:34:05
как же это не явные: import myImplicit myObject.callMethodWithMyImplicit вполне явно - нужен импорт
Как резолвится конфликт имён на импортах имплиситов? Импортированный имплисит можно дальше по коду переопределить?

Roman
03.10.2018
12:35:05
в классе есть такая штука private val api: Rest by inject() Хочу это замокать. В голову приходит вариант сделать это как var api: Rest by inject() а в тесте подменить controller.api = mock Есть ли другие варианты ?

Admin
ERROR: S client not available

Kirill
03.10.2018
12:36:43
Как резолвится конфликт имён на импортах имплиситов? Импортированный имплисит можно дальше по коду переопределить?
там не по именам а по типам, можно на стадии компиляции разные весёлости получить: diverging implicit declaration, ...

Roman
03.10.2018
12:39:06
constructor injections?
Да, возможно посмотрю в сторону этого

Andrey
03.10.2018
12:42:57
там не по именам а по типам, можно на стадии компиляции разные весёлости получить: diverging implicit declaration, ...
Ок. Имплисит, импортированный для некоторого типа, можно дальше по коду переопределить?

Kirill
03.10.2018
12:43:15
если в кратце то - нет

Roman
03.10.2018
12:52:06
Вроде должно
это tornadoFX class HomeController : Controller() { private val api: Rest by inject() где inject inline fun <reified T> inject( overrideScope: Scope = scope, vararg params: Pair<String, Any?> ): ReadOnlyProperty<Component, T> where T : Component, T : ScopedInstance = inject(overrideScope, params.toMap()) пока не представляю как замокать ?

Quantum Harmonizer
03.10.2018
12:56:41
Igor
03.10.2018
13:45:30
это tornadoFX class HomeController : Controller() { private val api: Rest by inject() где inject inline fun <reified T> inject( overrideScope: Scope = scope, vararg params: Pair<String, Any?> ): ReadOnlyProperty<Component, T> where T : Component, T : ScopedInstance = inject(overrideScope, params.toMap()) пока не представляю как замокать ?
На первый взгляд кажется, что лучше заменить дефолтный DI на koin (и там делать норм constructor-inj) Тут немного описано https://edvin.gitbooks.io/tornadofx-guide/content/part2/Dependency%20Injection.html

Google
Nameless
03.10.2018
14:10:34
Ну нахрена в тесты DI тащить то?.. ?
Так он же только для этого и нужен, разве нет?

Igor
03.10.2018
14:13:02
Если мы говорим, про di-framework (аля koin/kodein/dagger2), то он нужен что бы ручками граф не собирать. А для тестов - достаточно зависимости в конструктор принимать.

Bogdan
03.10.2018
14:13:30
Ну нахрена в тесты DI тащить то?.. ?
Я бы сказал что он хочет тестировать в контроллере и вю

Vladimir
03.10.2018
14:37:54
scala 2?
Better Scala

Arcady
03.10.2018
15:14:00
Аналог scalameta для котлина уже есть?

Leonid
03.10.2018
15:45:56
Нет, для этого же нужно компилятор шатать

Kirill
03.10.2018
15:49:33
Нет, для этого же нужно компилятор шатать
Найс тема для стажировки на лето или диплома, btw

Leonid
03.10.2018
15:52:02
Найс тема для стажировки на лето или диплома, btw
Вы что, хотите чтобы как на Укр^W как в скале?

Kirill
03.10.2018
15:55:02
Вы что, хотите чтобы как на Укр^W как в скале?
Но мы же можем анексиров^W сделать правильные макросы!

dimiii
03.10.2018
15:55:53
В dotty же нет макросов? Их деликатно перенесли в расширения, а оттуда еще подальше?

Alexey
03.10.2018
16:01:56
В dotty же нет макросов? Их деликатно перенесли в расширения, а оттуда еще подальше?
Есть blackbox macro + inline Inline будет более предсказуемой версией whitebox

Жабра
03.10.2018
17:13:50
Подскажите, плиз: что за * в синтаксисе? Типа *args

Quantum Harmonizer
03.10.2018
17:14:04
arrayOf(a, b, c) == arrayOf(*arrayOf(a, b), c)

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