
Andrey
04.09.2018
08:48:12

Quantum Harmonizer
04.09.2018
08:50:25
Глобальное изменяемое состояние? Идём рефакторить.

Maxim
04.09.2018
08:51:55

Google

Andrey
04.09.2018
08:52:46

Quantum Harmonizer
04.09.2018
08:52:56

Andrew
04.09.2018
08:56:48

Andrey
04.09.2018
08:56:48

Quantum Harmonizer
04.09.2018
08:57:44

Andrey
04.09.2018
08:58:33

Quantum Harmonizer
04.09.2018
08:59:49

Andrey
04.09.2018
09:00:56

Anton
04.09.2018
10:06:21
тут недавно были вопросы по поводу конфликтов имен с екстеншен функциями. к чему пришли в итоге?

Konstantine
04.09.2018
10:12:17
Уже вроде говорилось, но я забыл. Говорили, что корутины у нас доступны из коробки и ими можно пользоваться без доп. либы. Как я могу запустить что-то в виде корутины в андроеде не используя либу?

Google

Руслан
04.09.2018
10:15:32

Andrew
04.09.2018
10:15:59

Konstantine
04.09.2018
10:16:32

Anton
04.09.2018
10:17:01

Руслан
04.09.2018
10:21:16

Igor
04.09.2018
10:25:08

Руслан
04.09.2018
10:26:33
сначала захочется launch и runBlocking, потом withContext, потом окажется что exceptions нужно как-то там обрабатывать и в итоге будет куча плохо оттестированных велосипедов.

Igor
04.09.2018
10:27:50
Вот что действительно растраивает, что IO/DefaultDispatcher есть в core,
а вот UI для каждую платформу отдельный (хотя тот же DD может подбирать поаьформенную реализацию в рантайма)

Kirill
04.09.2018
10:27:56

Руслан
04.09.2018
10:29:06

Vlad
04.09.2018
10:44:04
https://twitter.com/asolntsev/status/1036602457185570817

Andrey
04.09.2018
10:46:46

Vlad
04.09.2018
10:47:21

Руслан
04.09.2018
10:51:07
А в соседней команде Антон Кекс успешно заадоптил Котлин)

Andrey
04.09.2018
11:02:39
Обнаружил тут небольшую проблемку в выведении типов при взаимодействии Kotlin с Java 8 Streams:
fun main(args: Array<String>) {
val map = listOf(1, 2, 3).stream()
.map { it to it * 2 }
.collect(Collectors.toMap({ it: Pair<Int, Int> -> it.first }, { it.second })) // так работает
val map1 = listOf(1, 2, 3).stream()
.map { it to it * 2 }
.collect(Collectors.toMap({ it.first }, { it.second })) // почему-то не может вывести, что ключ мапы Int
}
Нитересно, почему он не может вывести тип ключа мапы без подсказки?

Igor
04.09.2018
11:02:56
Мне бы наоборот, унечти UI в кор, что бы легко (интеграционные) unit тест писать

?Kolay
04.09.2018
11:04:56
А что будет работать быстрее? UI/IO

Руслан
04.09.2018
11:07:56
Обнаружил тут небольшую проблемку в выведении типов при взаимодействии Kotlin с Java 8 Streams:
fun main(args: Array<String>) {
val map = listOf(1, 2, 3).stream()
.map { it to it * 2 }
.collect(Collectors.toMap({ it: Pair<Int, Int> -> it.first }, { it.second })) // так работает
val map1 = listOf(1, 2, 3).stream()
.map { it to it * 2 }
.collect(Collectors.toMap({ it.first }, { it.second })) // почему-то не может вывести, что ключ мапы Int
}
Нитересно, почему он не может вывести тип ключа мапы без подсказки?
val pair = 1 to 1
val map2 = Collectors.toMap({ pair.first }, { pair.second })
минимальный пример
А что вообще значит такое объявление?
public static <T, K, U> Collector<T, ?, Map<K,U>>

Google

Andrey
04.09.2018
11:11:16
А что вообще значит такое объявление?
public static <T, K, U> Collector<T, ?, Map<K,U>>
Дженерик функция, с тремя параметризуемыми типами T, K и U, возвращающая Collector, параметризованный T, не важно чем, Map<K, U>

Руслан
04.09.2018
11:13:42
Я про вопросик конечно

Andrey
04.09.2018
11:14:04

Руслан
04.09.2018
11:14:35
ну вот тут тип не прокидывается, как котлин может вывести тип аккумулятора тут?
в джаве 10 с var работает?

Andrey
04.09.2018
11:15:54

Руслан
04.09.2018
11:16:05
ну так вот и не выводит)

Andrey
04.09.2018
11:16:47

dimiii
04.09.2018
11:25:47

Andrey
04.09.2018
11:28:57
Понял, это всё от variance. Без явного указания типа аргумента лямбды, он не может понять, это Pair<Int, Int> или кто-то из её предков, а без этого он не может вывести тип результата выражения it.first

dimiii
04.09.2018
11:29:03
К - консистентность
>>> val f = { it }
error: unresolved reference: it
val f = { it }

Andrey
04.09.2018
11:30:30

dimiii
04.09.2018
11:30:46

Andrey
04.09.2018
11:31:22

dimiii
04.09.2018
11:32:06

Andrey
04.09.2018
11:33:43

dimiii
04.09.2018
11:41:48

Andrey
04.09.2018
11:42:58

Google

Quantum Harmonizer
04.09.2018
11:43:32
У меня вообще есть object Just : (Any?) -> Any?, который я не стесняясь кастю во что попало.

dimiii
04.09.2018
11:43:50
Ну спасибо, хоть для функций оставили

Andrey
04.09.2018
11:44:42
В Котлине система типов мономорфная, то есть тип значения не может содержать дженериков, объявленных для самого значения.
Вот так можно, чтоб не засорять лишними лямбдами кучу:
private val id: (Any?) -> Any? = { it } // определяем id лямбду
fun <T> id(): (T) -> T = id as (T) -> T // говорим компилятору: "верь мне, я инженер, можешь кастить"

Quantum Harmonizer
04.09.2018
11:48:36
fun <T> id() = { it: T -> it }
думаю, эффект будет точно такой же

Andrey
04.09.2018
11:49:09

Admin
ERROR: S client not available

Quantum Harmonizer
04.09.2018
11:50:00

Andrey
04.09.2018
11:52:49
Нет, только что проверил.
Я, похоже, спутал с более хитрым случаем: если пытаться реализовать комбинаторы на Котлине, то identity выражается через S и K комбинаторы, как S(K)(K), и вот при таком выражении, у нас на каждый вызов identity создаётся новый объект:
import java.lang.System.identityHashCode
fun main(args: Array<String>) {
val iInt: I<Int> = i()
val iStr: I<String> = i()
println(identityHashCode(iInt))
println(identityHashCode(i<Int>()))
println(identityHashCode(iStr))
println(iInt(1))
println(iStr("a"))
}
typealias K<A, B> = (A) -> (B) -> (A)
fun <A, B> k(): K<A, B> = { a -> { a } }
typealias S<A, B, C> = ((A) -> (B) -> C) -> ((A) -> B) -> (A) -> C
fun <A, B, C> s(): S<A, B, C> = { x -> { y -> { z -> x(z)(y(z)) } } }
typealias I<A> = (A) -> A
fun <A> i(): I<A> = s<A, Any?, A>()(k())(k<A, Any?>())
Выводит
1818402158
1590550415
1058025095
1
a


Quantum Harmonizer
04.09.2018
13:01:55
Ой, какая жесть.
Ну, там присутствует захват, это решающий фактор.

Andrey
04.09.2018
13:07:59

Quantum Harmonizer
04.09.2018
13:08:30
Я не ФПшник, я джавист. Непонимат.

Andrey
04.09.2018
13:09:57

Quantum Harmonizer
04.09.2018
13:10:41

Alexey
04.09.2018
13:11:56
Ну вообще тут как раз понятно почему, потому что в языке не все объекты есть функция

Quantum Harmonizer
04.09.2018
13:12:23

Andrey
04.09.2018
13:12:30

Alexey
04.09.2018
13:13:02
Или у вот такого?
val <A> foo = listOf<A>()

Google

Quantum Harmonizer
04.09.2018
13:13:58

Alexey
04.09.2018
13:14:55

Quantum Harmonizer
04.09.2018
13:15:14
не, оно решимо, просто бестолково (из-за примера с листом)

Andrey
04.09.2018
13:15:45

Alexey
04.09.2018
13:16:48
Как параметрический, так и тайп классы

Quantum Harmonizer
04.09.2018
13:19:53
вот кстати, нет типа, который позволяет выразить fun <T> invoke(t: T): ...
то есть, когда такое нужно, хоть SAM-интерфейс пиши

Alexey
04.09.2018
13:20:22
А какой тип справа?

Andrey
04.09.2018
13:20:47
Список, это 100% не функция

Alexey
04.09.2018
13:21:10
Он не полиморфен
Он контрвариантен

Quantum Harmonizer
04.09.2018
13:21:22

Alexey
04.09.2018
13:22:34