
Quantum Harmonizer
11.04.2018
10:12:48

Юсуф
11.04.2018
10:13:13
PHP?
блэт, аксиома эскобара
шо то говно, шо это

Alexey
11.04.2018
10:15:21
лол, чем по твоему js хуже котлина?

Google

Quantum Harmonizer
11.04.2018
10:16:05

Sergey
11.04.2018
10:16:11
?

Alexey
11.04.2018
10:16:28
а я и не говорил, что js хуже, я на нём много чего написал

Igor
11.04.2018
10:17:10

Руслан
11.04.2018
10:18:33
Стикеры запретили, там видосы скидывать стали
Не надо так
И для обсуждения чем Js лучше Scala есть @jvmchat

Юсуф
11.04.2018
10:18:54
sore

Alexey
11.04.2018
10:19:10
Вы просто не понимаете, что я указываю на ваши фаталистские высказываения о том, что что-то хуже или лучше - это гомно
Можно было бы сказать, для меня js говно и всё было бы ок

Mikhail
11.04.2018
10:20:42
Какие-то одмины тут не ламповые(

Юсуф
11.04.2018
10:20:49

Alexey
11.04.2018
10:21:04
С колокольни js или php разработчика, компилятор и типы - это связывание по рукам и ногам

Google

Alexei
11.04.2018
10:21:21
ребята джес заточен под класное решение одной задачи клепание прототипов абы было

Alexey
11.04.2018
10:22:25
те кто хотели типы ушли тайп скрипт да и всё

Руслан
11.04.2018
10:22:51
Причем которые уже по 10 кругу проходят.

Mikhail
11.04.2018
10:24:05

Руслан
11.04.2018
10:24:10
К обеду нужно будет всполнить как в хаскеле и скале есть HKT, и обсудить в очередной раз FP на котлине.

Vitalii
11.04.2018
10:24:48
Все почему-то забывают, что котлин медленнее джава.

Mikhail
11.04.2018
10:25:01
А что в этом плохого? Приходят же сюда раз в неделю с вопросом "а как написать let2?"

Aleksandr
11.04.2018
10:25:14
, которая медленее си

Руслан
11.04.2018
10:25:29
И быстрее всего остального на JVM.

Alexei
11.04.2018
10:25:48
а инлайны не помогают?
вроде лямбды полутче котлиновские
а учитывая как народ упрлс по фп то можно предположить что это норм буст

Quantum Harmonizer
11.04.2018
10:27:00

Alexei
11.04.2018
10:27:00

Quantum Harmonizer
11.04.2018
10:27:34

Igor
11.04.2018
10:27:48
f: (A, B) -> C?

Mikhail
11.04.2018
10:28:14
ага

Google

Mikhail
11.04.2018
10:28:35
fun <P1, P2, R> let2(p1: P1?, p2: P2?, block: (Pair<P1, P2>) -> R): R? {
return p1?.let { v1 -> p2?.let { v2 -> block(v1 to v2) } }
}

Igor
11.04.2018
10:28:39
А зачем, собственно, если можно написать tuple2 и использовать let с destructive declaration с ним?

Mikhail
11.04.2018
10:28:55
хмм

Igor
11.04.2018
10:29:04
Щас скину пpимеp.

Mikhail
11.04.2018
10:29:47
ну тогда tuple2 жеш не нулл и лет его в любом случае пропустит
let2: (A?, B?) -> ((A, B) -> C) -> C?

Igor
11.04.2018
10:30:40
https://gist.github.com/komigor/230cf2fdafea8d343e2b49c06c954dbb
А, в этом смысле. Так тогда лучше уж в Option какой-то обеpнуть, нет?

Mikhail
11.04.2018
10:31:36
ну так ? == Option
только без накладных расходов

Igor
11.04.2018
10:31:51
у ? нет zip.
и для ? zip не написать
А вот выше and для nullable типов можно пеpеопpеделить (для пpавой nullable части)

Mikhail
11.04.2018
10:37:46
напомни хотяб сигнатуру zip для Option
если ты про Option<A> -> Option<B> -> Option<Tuple<A,B>>, то в написаный мною выше let2 в качестве зиппера передаешь Pair::new и готово
а не, даже ничего передавать не надо
просто { it }

Igor
11.04.2018
10:43:32

Igor
11.04.2018
10:44:42
Удобно. Иногда писать data-классы для сущностей лениво, или нет особого смысла, а вот в TupleN закинуть все, чтобы потом можно было за одну опеpацию null-чек делать очень даже ничего.

Mikhail
11.04.2018
10:47:27
Иногда нужен nullsafe-конструктор, который бы вернул null, если один из требуемых аргументов null

Google

Mikhail
11.04.2018
10:48:44
то, что написал @ikomarov, если допилить напильником и добавить перегрузок для nullable аргументов, можно получить ad hoc мини-dsl'ю для такого кейса

Igor
11.04.2018
10:50:04
inline infix fun <T1: Any, T2: Any> T1?.andOpt(_2: T2?) = when {
this == null -> null
_2 == null -> null
else -> this and _2
}
Вуаля.

Mikhail
11.04.2018
10:50:45
но если обобщить задачу, то можно с помощью FP решить ее штукой под названием Applicative, сделав <ConstrucorName>::new fmap A apply B apply C
и тогда можно вводить другую абстракцию, например не Option, а Verified
и в случае неудачи выводить не null, а список проваленных проверок

Igor
11.04.2018
10:52:13

Michael
11.04.2018
10:57:20
есть классный вариант названия для такой библиотечки - Haskell

Igor
11.04.2018
11:00:51
Да нет, на котлине судя по всему большую часть необходимого можно без видимых со стоpоны api костылей pеализовать. Так что на пеpвое вpемя пойдет.

Vitalii
11.04.2018
11:03:06

Mikhail
11.04.2018
11:05:46

Igor
11.04.2018
11:08:21
Смотpел, но отчасти я не совсем доволен им, отчасти нужно самому написать, чтобы осознать, как пользоваться :)
Люблю вечеpами/в свободное от pаботы вpемя чем-нибудь таким заниматься, так что на мой взгляд в этом случае готовое лучше не бpать по кpайней меpе пока не напишешь сам что-то похожее

Michael
11.04.2018
11:10:13
не доволен - поправь

Igor
11.04.2018
11:11:10
Ну, как выше написал, для начала напишу свое, потом pешу, что лучше :) Так же было когда-то давно и с мокси или чем-то таким. Написал свое, оказалось пpоще и компактнее (UPD: IMO)

Vitalii
11.04.2018
12:01:26
Зашарь потом своё посмотреть :)

Igor
11.04.2018
12:10:43
оки-доки ;)

Igor
11.04.2018
12:10:48
Под андpоид бы еще... :)
ReactNative + F#/Clojure/Elm/PureScript/...
А все эти "операторы" в kotlin выглядят, как попытка натянуть сову на глобус.
Я сам таким упарывался где-то год назад, но сейчас понимаю что это:
- не нативно и сложно будет обяснить др и даже самому вспомнить через год что для чего
- сложно переносить код, тк со стороны напилина эта груда let2/tuple (этого нет "из коробки")
- лишние абстракции (типа Option<T> и тд), которые только захламляют код

Vitalii
11.04.2018
12:11:40
Ну если до такой степени упарываться, то ту же Clojure можно нативно прикрутить, вместо cljs+react native.

Google

Vladislav
11.04.2018
12:19:04
В котлине в стандартной либе такой функции случайно нет?
StringBuilder().ifNotNull(value1) { append(it) }.ifNotNull(value2) { append(it) }
можно конечно так:
StringBuilder().apply { v1?.let { append(it) } }
но чуть больше скобочек получается

Иван
11.04.2018
12:22:03
Наверное только
listOf(a, b, c, d)
.filterNotNull()
.forEach {}

Руслан
11.04.2018
12:23:06
buildString {
v1?.let(::append)
v2?.let(::append)
v3?.let(::append)
}

Vladislav
11.04.2018
12:27:18

Руслан
11.04.2018
12:27:49
with(obj) {}

Vladislav
11.04.2018
12:29:39
У меня в проекте много различных билдеров и некоторые их методы надо звать опционально. С обычным if'ом вообще стрёмно, appy{let{}} уже получше, вот если бы была прямо такая функция в стандартной либе, то было бы вообще хорошо )

Sergey
11.04.2018
12:42:27

Aleksandr
11.04.2018
15:29:07
коллеги добрый вечер, такой вопрос:
fun search(src: String): String? {
return null;
}
fun start() {
val avail = emptyMap<String, Int>();
val res: String = avail.keys.map{ search(it)}
.filterNotNull()
.sortedBy { it.length }
.first();
}
`
вызовет exception - это идеологически? везде всегда писать firstOrNull() надо?

Жабра
11.04.2018
15:30:06

Aleksandr
11.04.2018
15:30:41
но ведь first никогда не уверен что получит результат по идее

Жабра
11.04.2018
15:30:50

Aleksandr
11.04.2018
15:31:10
да привычка, пробую kotlin и пытаюсь понять в сравнении с java/clojure стоит ли

Глеб
11.04.2018
15:31:21

Жабра
11.04.2018
15:31:52

Alex
11.04.2018
15:37:10