
Egor
19.10.2018
12:11:56
Экстеншены это вообще благодать, это добавление функционала классу без вторжения в сам класс
Мультиресиверы просто продолжают эту концепцию

Алексей
19.10.2018
12:13:00
кстати, а как вызывать экстеншн-функцию класса ?

Beholder
19.10.2018
12:13:15

Google

Алексей
19.10.2018
12:13:27

Quantum Harmonizer
19.10.2018
12:13:53

Boris
19.10.2018
12:15:22
такие мультирессиверные функции мне очень хотелось когда я с графикой работал, вообще могла бы быть очень приятная фича, при этом с первого взгляда кажется, что ничего особого не требующая для релизации, ну может разве что придумать внятный синтаксис для него

Egor
19.10.2018
12:17:00
Насчет синтаксиса вроде даже обсуждение в ютраке есть двухгодичной давности

Boris
19.10.2018
12:17:46

Beholder
19.10.2018
12:19:29

Quantum Harmonizer
19.10.2018
12:19:35

Egor
19.10.2018
12:19:50

Quantum Harmonizer
19.10.2018
12:19:55

Beholder
19.10.2018
12:20:33
мне не про ресиверы интересно, а HKT

Egor
19.10.2018
12:21:46
конкретно в котлине тайпклассы - это своего рода расширение понятия контекстов, которые создаются засчет экстеншенов
По-крайней мере, в том виде, в котором они предлагаются

Beholder
19.10.2018
12:22:18
вот так всегда - попросишь рассказать, а в ответ теория и математика... :(

Google

Egor
19.10.2018
12:22:50
meh

Beholder
19.10.2018
12:23:10
как оно практические задачи может облегчить? что-нибудь тупо бухгалтерское. или типо gui

Boris
19.10.2018
12:23:34

Egor
19.10.2018
12:24:12
Тайпклассы - это просто фича, которая улучшает код
Так, ладно, окей

Igor
19.10.2018
12:26:52

Beholder
19.10.2018
12:28:38
мне хочется верить, что это чудесная вещь, но виднеется везде что-то сферическое в вакууме

Alexey
19.10.2018
12:31:06

Igor
19.10.2018
12:31:28
Ну такое, с костылями не нужно (там даже доки на них нет)

Beholder
19.10.2018
12:31:36
можно статеечку хоть на английском, но только без хаскела и монад

Egor
19.10.2018
12:32:27
https://arrow-kt.io/docs/patterns/error_handling/
Не фри, но монады

Igor
19.10.2018
12:32:36

Egor
19.10.2018
12:32:39
и да, Arrow привет

Alexey
19.10.2018
12:33:32
Все сервисы тут тайп классы
Тайп классы в "ковычках" конечно

Igor
19.10.2018
12:34:34
кекус, сейчас бы везде Kind<,> и fix писать

Alexey
19.10.2018
12:35:18
Ну без hkt сорян

Google

Egor
19.10.2018
12:36:13

Alexey
19.10.2018
12:36:18

Beholder
19.10.2018
12:36:26
в идеале хотелось бы как - вот программирет какой-нибудь Вася бухглатерию и формочки, хоть веб, хоть gui, и чувствует, что заколебался. и тут прилетает волшебный пони и говорит - Вася, тебе позарез нужны HKT и твой код станет в три раза короче и понятнее

Quantum Harmonizer
19.10.2018
12:36:37

Руслан
19.10.2018
12:36:51

Quantum Harmonizer
19.10.2018
12:37:42

Mikhail
19.10.2018
12:48:57

Bogdan
19.10.2018
12:51:06
Ну вообще-то вместо срача можно придумывать новые идеи/концнпции, обсуждать возможность их реализации. Также вместо того что бы просто "тырить", предлагать модернизированные варианты "подсмотреного" у других, а не тупо тащить все из других яп

Mikhail
19.10.2018
12:51:39

Bogdan
19.10.2018
12:51:56
Вот тема про дополнительный ресивер интересна, и ее нужно продвигать

Mikhail
19.10.2018
12:52:25
окей, раз уж пятничка, го
какие есть юзкейсы помимо UI?
надо набросать

Quantum Harmonizer
19.10.2018
12:53:29
какие есть юзкейсы помимо UI?
https://github.com/Miha-x64/reactive-properties/blob/master/sql/src/main/kotlin/net/aquadc/properties/sql/schema.kt#L165

Mikhail
19.10.2018
12:54:43

Quantum Harmonizer
19.10.2018
12:54:49
^ поменял ссылку
https://github.com/Miha-x64/reactive-properties/blob/master/logic-sample/src/main/kotlin/net/aquadc/propertiesSampleLogic/sql/schema.kt#L38

Bogdan
19.10.2018
12:55:37

Sergey
19.10.2018
12:55:51
на build.gradle.kts все же перекатился и от большой колбасы путей sql/src/main/kotlin/net/aquadc/properties/sql/schema.kt избавился на одном проекте?

Quantum Harmonizer
19.10.2018
12:56:21
А что исчезает? src? main? kotlin?

Google

Sergey
19.10.2018
12:56:49
sql/src/properties/sql/schema.kt остается

Mikhail
19.10.2018
12:56:56

Konstantine
19.10.2018
12:59:38
Мы встроим дженерик в твой дженерик, чтобы ты мог использовать дженерик со своим дженериком.

Mikhail
19.10.2018
13:00:50
так, может это еще для каких-нибудь вложенных корутин подойдет?

Quantum Harmonizer
19.10.2018
13:03:20

Igor
19.10.2018
13:32:25
Кто-нибудь видел статейки/рецепты/подходы про то, как написать "кастомную стейт-машину, для интерпретации корутин"?
Ну те можно залезть в сорцы SequnceBuilder с его yield, но может кто-то уже разложил такой подход по полочкам.

Dmitry
19.10.2018
13:53:58
Новый вариант ставить пробелы и прочие настройки оформления по какому запросу гуглить?
Забыл, как это называется

Mikhail
19.10.2018
13:55:10
новый вариант ставить проблеы?
codestyle?

Dmitry
19.10.2018
13:56:30
Чтобы reformat code автоматически расставляло пробелы в 2 раза меньше. Это кодстайл называется?
ЖБ новый вариант настроек предложили, но я не могу найти описание этого события

Sergey
19.10.2018
13:58:00
официальный)
https://kotlinlang.org/docs/reference/coding-conventions.html

Mikhail
19.10.2018
13:59:17
он про автоформатирование

Sergey
19.10.2018
13:59:34
это оно и есть

Dmitry
19.10.2018
14:02:05
Ага спасибо. Видимо новый формат от старого не особо то отличается.


Andrey
19.10.2018
14:38:12
вот так всегда - попросишь рассказать, а в ответ теория и математика... :(
В простейшем виде typeclass - это такой интерфейс, реализацию которого ты можешь описать где угодно, а не только в определении класса.
Пример на псевдоязыке:
typeclass Hello<T> { // тайпкласс
val hello: String
}
...
instance Hello<String> { // реализация для String. Описана отдельно от описания класса String
override val hello: String
get() = "Hello $this"
}
...
fun T greet(hi: Hello<T>) = println(hi.hello) // функция определённая для произвольной реализации тайпкласса
...
greet("foo") // выведет "Hello foo"
HKT или роды типов - описания структуры конструктора дженерик типа (сколько тайп параметров у дженерика, какой род у каждого тайп параметра)
Пример для тайпкласса Functor:
typeclass Functor<F<A>> { // F - дженерик (род * -> *), параметризуемый одним простым типом (род *)
fun <B> map(f: (A) -> B): F<B> // если в языке есть роды типов, то возможны сигнатуры типа, где тайп параметр F параметризован другим тайп параметром
}
...
instance Functor<List<A>> { // теперь List является функтором и его можно использовать как аргумент любой функции, принимающей функтор
override fun <B> map(f: (A) -> B): List<B> {...}
}
То есть HKT нужны, чтобы более точные ограничения на дженерики описывать (map возвращает не просто какой-то F, а F<B>)


Alexander
19.10.2018
14:50:12
Абстракцию над данными, причем круче, чем интерфейсы
Пропустил, пока ребенка выгуливал. Вложенные контексты по моим ощущениям заменяют тайп-классы более изящным образом, и при этом добавляют некоторые идейно новые вещи, которые пока даже сложно оценить.
Простой пример - это вынесение поведения в контекст. Если сейчас мы для определения различных поведений наследуем класс, в тайп классах, добавляем ему трейт, то в контекстно-ориентированном варианте, мы создаем новый контекст и запускаем нашу логику в этом новом контексте.

Andrey
19.10.2018
14:52:09
Используется примерно для таких задач:
Есть у меня последовательность map вызовов, и хочу я, чтобы она работала для List, Sequence, Array и прочего, на что можно мэпиться.
При этом без HKT придётся держать по одной реализации этой последовательности map для всех перечисленных вариантов.
С HKT можно обойтись одной реализацией для функтора, которая будет работать для всего, что является функтором.

Google

Egor
19.10.2018
14:52:56

Andrey
19.10.2018
14:53:11

Alexander
19.10.2018
14:53:27
Логика в разных местах живет

Andrey
19.10.2018
14:54:42
Чего-то я не уверен
Ну в Haskell монад трансформеры как раз для вложенных контекстов разных монад используются

Alexander
19.10.2018
14:55:02

Andrey
19.10.2018
14:55:16

Boris
19.10.2018
14:55:44
Не понимаю, как мультикониекст может заменить тайпклассы

Andrey
19.10.2018
14:55:54

Alexander
19.10.2018
14:57:59
Они по разному работают, но результата примерно одинаковый

Boris
19.10.2018
14:58:02

Andrey
19.10.2018
14:58:03
Тайп классы - более мощная абстракция, чем абстрагирование контекста.

Alexander
19.10.2018
14:58:12
Под контексты надо исходно код по-другому писать

Andrey
19.10.2018
14:58:31

Alexander
19.10.2018
14:59:37
Я думаю, что это развитие в разные стороны. Не понятно, что лучше. Тайп классы довольно хорошо исследованы, а что можно наворотить на хорошей контекстной логике пока до конца не понятно. При чем тут чисто инженерно надо смотреть, никакая математика не поможет.

Bogdan
19.10.2018
15:01:37
https://www.youtube.com/watch?v=v3dr4e54TLA
кто смотрит ?
или в оффтоп ?

Andrey
19.10.2018
15:01:49

Egor
19.10.2018
15:02:13
Ну, не то чтобы экстеншены собирались стрелять в ногу