Size: a a a

Kotlin Community

2021 January 08

AL

Alexander Levin in Kotlin Community
LevT
Ну, это один из многочисленных котлиновских шорткатов. Дико мне интересных (т.ч. спасибо!),
но всё же вторичных по сравнению с идиоматическим ФП

Шорткаты конечно покрывают многое, но всё ж не всё, иногда вместо tail придётся саблистами ворочать, или вот хелпер добавлять
Так вы не исходите из предположения, что всё, что выглядит не как в Хаскелле это плохо и шорткаты и жизнь сразу наладится. С точки зрения относительно базовой работы с коллекциями при переходе на Котлин (примечание - базовой, я не говорю про те ситуации, где в Скале я постоянно оперировал чем-то вроде traverse, с этим в Котлине плохо)

Т.е. да, бывают ситуации, когда неплохо было ещё каких базовых функций довезти (последний раз мне нужен был zip по трём коллекциям), но в основном это всё функции, которые не очень популярны и не факт, что нужны в стандартной либе (а не те, которые толком на натягиваются концептуально)

Более того, количество боли в Скале часто было больше (привет, очень плохо выглядевшие функции, связанные с сортировками)
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Levin
Так вы не исходите из предположения, что всё, что выглядит не как в Хаскелле это плохо и шорткаты и жизнь сразу наладится. С точки зрения относительно базовой работы с коллекциями при переходе на Котлин (примечание - базовой, я не говорю про те ситуации, где в Скале я постоянно оперировал чем-то вроде traverse, с этим в Котлине плохо)

Т.е. да, бывают ситуации, когда неплохо было ещё каких базовых функций довезти (последний раз мне нужен был zip по трём коллекциям), но в основном это всё функции, которые не очень популярны и не факт, что нужны в стандартной либе (а не те, которые толком на натягиваются концептуально)

Более того, количество боли в Скале часто было больше (привет, очень плохо выглядевшие функции, связанные с сортировками)
в хаскеле боли меньше, чем в скале
источник

L

LevT in Kotlin Community
Скала:  
ps.zip(ps.tail).count { case (a, b) => a > b }

Котлин:
xs zip xs.subList(1, xs.size).count { (a, b) -> a - b }

Как это второе грамотно подхинтовать от красноты?
источник

AL

Alexander Levin in Kotlin Community
LevT
Скала:  
ps.zip(ps.tail).count { case (a, b) => a > b }

Котлин:
xs zip xs.subList(1, xs.size).count { (a, b) -> a - b }

Как это второе грамотно подхинтовать от красноты?
Передать предикат в count?
источник

AL

Alexander Levin in Kotlin Community
Ну всмысле у вас там a - b, вроде не компаратор просят, а просто компаратор. Ну и да, не пытайтесь делать кальку с других языков, сами же себе вредите.
источник

AL

Alexander Levin in Kotlin Community
Iaroslav Postovalov
в хаскеле боли меньше, чем в скале
Ну, с чем работал, про то мне комфортнее говорить. Хаскель только в универе учил, что даёт представление, но не настолько, чтобы уверенно говорить о плюсах и минусах. Со Скалой хотя бы работал, поэтому могу на основе опыта говорить о том, что для разовых скриптов мне проще было вспомнить котлин, чем на скале их же писать.
источник

L

LevT in Kotlin Community
Alexander Levin
Передать предикат в count?
Напишите, плиз, чтобы время сэкономить.. А то у меня получается длинно и пока всё равно красно.
источник

AL

Alexander Levin in Kotlin Community
LevT
Напишите, плиз, чтобы время сэкономить.. А то у меня получается длинно и пока всё равно красно.
Ну, шаг первый - если уж работать с sublist, то взять результат zip в скобки, чтобы порядок операций был понятен.
Шаг второй - поскольку нужен предикат, то a > b, а - b
источник

AL

Alexander Levin in Kotlin Community
*шаг третий - zipWithNext
list.zipWithNext().count { (l, r) -> l > r }
источник

ВМ

Валерий Маевский... in Kotlin Community
Хм, для разовых скриптов на "посчитать" хаскель как-то проще котлина/груви, ибо те грузятся только секунды две
источник

L

LevT in Kotlin Community
Alexander Levin
Ну, шаг первый - если уж работать с sublist, то взять результат zip в скобки, чтобы порядок операций был понятен.
Шаг второй - поскольку нужен предикат, то a > b, а - b
спс, скобки выручили от красноты, и отдельное спасибо за третий шаг
источник

L

LevT in Kotlin Community
Вполне идиоматично. И практично
источник

DK

Denis Kalinochkin in Kotlin Community
Валерий Маевский
Хм, для разовых скриптов на "посчитать" хаскель как-то проще котлина/груви, ибо те грузятся только секунды две
Скрипт обычно пишется дольше, чем две секунды
источник

ВМ

Валерий Маевский... in Kotlin Community
Видимо, разные скрипты пишем
источник

AM

Andrew Mikhaylov in Kotlin Community
LevT
Example 2.1.5.4    
In a  given sequence  
2.1.5.4    
In a  given sequence  pi , count  how many  times  pi (i)   >  pi(i +1)   occurs.
Hint:  use zip  and tail.

Вот такого рода проблемы натуральнее решаются с таким девайсом как tail

А перформанс... ну давайте вообще линкдлист запретим наравне с "одобрением наркотиков", указом роскомпозора.
Хотите константный tail(1) -- возьмите библиотеку kotlinx.collections.immutable, она как раз более логична при использовании в этой парадигме.
источник

L

LevT in Kotlin Community
Andrew Mikhaylov
Хотите константный tail(1) -- возьмите библиотеку kotlinx.collections.immutable, она как раз более логична при использовании в этой парадигме.
Спасибо. Но это в копилку... после обоих фп и котлина.
Кстати, что по-вашему приоритетней, вот эта вот либа или arrows-kt?
источник

AL

Alexander Levin in Kotlin Community
LevT
Спасибо. Но это в копилку... после обоих фп и котлина.
Кстати, что по-вашему приоритетней, вот эта вот либа или arrows-kt?
Если я правильно помню, Arrow не прямо даёт тебе много новых коллекций (там есть обёртка над листом, но только, чтобы получить симуляцию HKT и тд)
источник

AM

Andrew Mikhaylov in Kotlin Community
LevT
Спасибо. Но это в копилку... после обоих фп и котлина.
Кстати, что по-вашему приоритетней, вот эта вот либа или arrows-kt?
Они ортогональны, kotlinx.collections.immutable просто о наборе иммутабельных коллекций.
источник

AA

Andrey Antipov in Kotlin Community
Andrew Mikhaylov
Хотите константный tail(1) -- возьмите библиотеку kotlinx.collections.immutable, она как раз более логична при использовании в этой парадигме.
А чем такая реализация плоха?
fun <T> List<T>.tail(): List<T> = subList(1, size)

Вроде за константное время должна быть
источник

DK

Denis Kalinochkin in Kotlin Community
Andrey Antipov
А чем такая реализация плоха?
fun <T> List<T>.tail(): List<T> = subList(1, size)

Вроде за константное время должна быть
Почему константное? Новый ArrayList создается
источник