
Quantum Harmonizer
06.12.2017
12:36:28
тут не стоит отталкиваться от спеки конкретного языка

Gor
06.12.2017
12:37:07

Quantum Harmonizer
06.12.2017
12:37:34

Google

Gor
06.12.2017
12:39:30
т.е. использования всех полей класса

Quantum Harmonizer
06.12.2017
12:40:01
да, но это негибко в реальной жизни

Gor
06.12.2017
12:40:06
ломать такой концепт - хз хорошо ли
просто это совсем неок переопределить хешкод для класса чтоб он работал с одним полем из 10

Quantum Harmonizer
06.12.2017
12:41:15
нужен ли сам концепт? Может, можно отказаться от него?

Gor
06.12.2017
12:41:29
если нужен особенный кейс, можно сделать отдельно

Quantum Harmonizer
06.12.2017
12:41:33
(так, пора выдать себе предупреждение за флуд)

Gor
06.12.2017
12:41:47

Quantum Harmonizer
06.12.2017
12:41:56

Gor
06.12.2017
12:42:19
в общем флуд жестокий, имхо compareTo не такой коммон случай, и фактически не может быть применим ко всем объектам в отличии от equals

Google

Quantum Harmonizer
06.12.2017
12:45:27

Gor
06.12.2017
12:45:52

BaLoo
06.12.2017
12:46:12
То есть не имеет.

Quantum Harmonizer
06.12.2017
12:46:29

BaLoo
06.12.2017
12:46:31
То, что что-то можно сравнить каким-то образом, не значит, что это нужно делать.
Но тем не менее от там есть.
Тогда почему compare не должно быть?

Igor
06.12.2017
12:47:28

Quantum Harmonizer
06.12.2017
12:48:14

BaLoo
06.12.2017
12:50:25
Да, этот вопрос родился из решения конкретной задачи.

Quantum Harmonizer
06.12.2017
12:51:36

BaLoo
06.12.2017
12:53:04
То есть он не смог уйти от сумрачного наследия джавы.

Quantum Harmonizer
06.12.2017
12:54:11

Gor
06.12.2017
12:57:13

Quantum Harmonizer
06.12.2017
12:57:25
сравнивать ссылки в managed-языке — не кажется ли странным?

Gor
06.12.2017
12:59:17

Quantum Harmonizer
06.12.2017
12:59:31

Gor
06.12.2017
13:00:01
но учитывая изначально идею построить всю програму на отдельных блоках которые взаимосвязанны, и не меть возможности различать однотипные - странно

Google

BaLoo
06.12.2017
13:05:55
Просто подумайте, как часто вам нужно определять равенство хранимых данных, и как часто то, что два имени связаны с одним и тем же инстансом.
Я понимаю, что это в общем случае может сильно зависеть от задачи, но всё-таки я уверен, что перевес будет в сторону первого.

Phil
06.12.2017
13:16:16
Ну, вот в моих кейсах сравнение по умолчанию не нужно никогда )

Igor
06.12.2017
13:52:21
Народ, как красиво запустить N паралельнных URL(…).readText() (видимо через deferred)
а потом собрать коллекцию длин этих строк, подставляя вместо упавших закачек -1?
(Подвох в том, как сделать это без try/catch)

Boris
06.12.2017
13:56:53

Igor
06.12.2017
14:05:04
В Java есть URL.readText и Defrred<T>?
Конечно в Котлин. Хочу понять как идиоматично чейнить suspend функции.
Пока придумал через такой экстеншен:
suspend fun <T> Deferred<T>.awaitResult(): Result<out T, out Exception> =
try {
Ok(await())
} catch (e: Exception) {
Error(e)
}
Вообще хочется понять имеет ли смысл писать такие фукнции:
suspend fun downloadBytes(url: String): Result<ByteArray, Errors>
С одной стороны ошибки видны в типе-функции,
но как и с использование в Java/Scala Option<T> вместо T? есть подвох (компилятор не помешает функции все равно сделать сайд-эффект)

Руслан
06.12.2017
14:08:54
ну вот мне кажется что большого смысла нет
бери CompletableFuture просто
кому нужно сможет сделать cf.await(), а ты будешь цепочки писать

Igor
06.12.2017
14:11:58
Можно конечно сослаться, что я под отсталый android пишу,
но суть то не в этом, а в том что бы “эффекты” явно выражать, что бы отличать pure код/от кода с сайд-эффектами.
Или смириться с тем что все suspend функции могут быть с некотролиролируемыми эфектами (исключения).

Руслан
06.12.2017
14:15:29
ну cf/rx как раз же чтобы эффекты контролировать
и асинхронно писать

Boris
06.12.2017
14:17:06
Я имел ввиду джава или андроид ?
Хотя там конечно тоже джава ?

Yura
06.12.2017
14:43:04
Добрый день.
Подскажите, пожалуйста, можно ли на Kotlin написать мобильное приложение, которое будет работать под android и ios?(Прим: Xamarin для .NET)

Sergey
06.12.2017
14:47:05
см kotlin/native

Yura
06.12.2017
14:48:29

Roman
06.12.2017
14:51:53
Другое дело что не сильно удобно использовать будет.

Igor
06.12.2017
14:52:27
ну cf/rx как раз же чтобы эффекты контролировать
Не вижу как CF позволяет лучше контролировать эффект, да и код получается сложнее https://pastebin.com/ztV0pJmN
А у suspend тут есть явные преимущества:
- компилятор явно запрещает вызвать код “делающий эффекты” (suspend) из обычного кода
(с CF тебе никто не мешает вызвать метод возвращающий CF и забыть повесить обработчик)
- с RX/CF твой код перестает быть простым и становится “монадическим”, состоящим из map/flatMap
- кучу операторов надо запоминать (в rx с этим вообще беда)

Google

Artem
06.12.2017
14:53:13
Привет всем) Есть здесь люди, которые работали с KotlinJs?

Roman
06.12.2017
15:00:51

Quantum Harmonizer
06.12.2017
15:02:43
Увы, эта монада иногда выстреливает.

Admin
ERROR: S client not available

Nikolay
06.12.2017
15:02:59

Artem
06.12.2017
15:03:20

Nikolay
06.12.2017
15:04:16
да не, все круто же

Artem
06.12.2017
15:04:37
Да причем тут это? Я вроде бы не спрашивал, что лучше)

Quantum Harmonizer
06.12.2017
15:05:21

Nikolay
06.12.2017
15:06:21

Roman
06.12.2017
15:06:38
Увы, эта монада иногда выстреливает.
Так уж эта монада устроена. Если ничего специально не предпринимать, то исключение по умолчанию прокидывается выше. Собственно в Хаскеле вот Either монада вот ровно так работает, как ведет себя Котлин

Quantum Harmonizer
06.12.2017
15:07:10

Igor
06.12.2017
15:07:22


Roman
06.12.2017
15:07:56
Нет. Если функция возвращает Either<E,T> и написана через do нотацию по этой монаде, то первая ошибка станет left результатом выполнения.
Хаскель заставит объявить тип результата как Either (или выведет) это да. В Хаскеле можно объвить функцицию которая никогда не кидает исключение (результат просто T) это да. Но только к purity это не имеет никакого отношения. В хаскеле есть panic который нельзя ни поймать ни представить типом.

Sergey
06.12.2017
15:16:34

Roman
06.12.2017
15:16:47
Так что всё это одна фигня. Просто в одних языках (haskell, swift) ошибки делятся на исключения и паники (первые преставлены в типе и их можно поймать, а вторые не представлены в типе и их нельзя поймать). А в Котлине другой подход. Все ислючения можно поймать, но они не представлены в типе так как могут лететь отовсюду (среднее между паниками и исключениями), но зато есть удобный и легкий механизм работы с nullable значениями для преставления в типе ошибок вида "я не смог найти эту штуку" (когда не нужны подробности кроме сообщения о индикации того, что операция не получилась)


Igor
06.12.2017
15:33:51
Почему бы (если хочется омазаться фп) весь код не разделить на 2 части?
= Suspend функции, в которых делать: =
- асинхронные запросы (в виде обычного имеративного кода, без всяких thenApply/flatMap)
- IO (логично что IO должно быть асинхронным что бы потоки не лочить)
- кидать исключения и прочие эффекты
= Остальной код на “чистых” функциях =
Тут запретить юзать IO/throw
Котлин как бы к этом и поддталкивает, тем что можно вызывать из suspend обычный код, но НЕ наоборот.
P.S. понятно что это программирование “по конвенции” и работать не будет.


? animufag ?
06.12.2017
15:40:48
собственно для этого и нужны были эти монадки, что они могут выражать собой эффекты, в частности побочные эффекты (внешний мир) и такое мы можем представить в виде вполне себе немагического типа и недавать программисту других путей вызывать побочные эффекты (но на самом деле давать unsafe тк язык прагматичный и всё всё равно скатывается в конвенции, но уверенности на порядок больше)
от эксепшенов уже не отказаться, тк jvm-центричный мир. самостоятельно эксепшены наверное лучше никогда не кидать.
мб случай с многопоточностью есть, когда эксепшен прям удобно кинуть. хотя не уверен.

Google

Igor
06.12.2017
15:45:03

? animufag ?
06.12.2017
15:45:47

Yevhen
06.12.2017
16:31:03
https://habrahabr.ru/company/JetBrains/blog/339400/

Artem
06.12.2017
16:35:28
Быть может кто-нибудь всё таки знает. Как данные строки будут выглядеть в kotlinjs?
const { Botact } = require('botact')
const bot = new Botact({
confirmation: CONFIRMATION,
token: TOKEN
})
Буду крайне благодарен за помощь)

Sergey
06.12.2017
16:56:20
external fun require(module:String):dynamic
val Botact = require("botact")
val bot = Botact(mapOf("confirmation" to CONFIRMATION, "token" to TOKEN))
как-то так
ну это если интероп с жсом, в чистом котлинжс будет попроще все)

Artem
06.12.2017
16:57:24
да в чистом тоже думаю да) Но в том-то и дело, что либа написана на js
Сейчас буду пробовать. Спасибо!

Roman
06.12.2017
17:27:28
Пытаюсь сделать debounce по аналогии с rx, но что-то получается больно много кода, мб можно как-то иначе, покрасивее?
https://gist.github.com/romansl/d871727a247a3ea2209bf74e5170c95e
И вопрос в догонку: почему-то когда я вызываю job.cancel(), то ожидающий завершения job.join() не бросает CancellationException(). Вопрос: почему?
В примере это строка 26, она никогда не вызывается.

Roman
06.12.2017
17:33:03
А почему он его должен бросать?