var = set(num for num in range(1, modulo) if gcd(num, modulo) ==1). Есть ли в Котлин такая возможность, прохождение по последовательности и запись некоторых данных, которые подходят по условию?
var = (1..modulo).filter { number → gcd(number, modulo) == 1 }
(1..modulo).filter { gcd(it, modulo) == 1 }
Пояснение. Collection comprehension в питоне от бедности. Там для того, чтобы оно работало не бесконечно долго, надо делать языковую конструкцию, которая два действия в одно разворачивает. В котлин для этого достаточно операций на коллекциях и последовательностях.
видимо offtopic, но.. Какие "два действия" имелись в виду? И почему иначе было бы бесконечно долго?
Фильтрация и применение. Стандартный питон - это интерпретатор, поэтому там нет оптимизации внутренности циклов. Ну и кроме того, надо два раза проходиться по коллекции.
так в котлине фильтрация и маппинг коллекций — тоже отдельные действия (и отдельные циклы) А синтаксис comprehensions за счёт чего улучшает ситуацию?
Во-первых есть Sequence, где действия склеиваются, во-вторых в котлин мы можем спокойно вставить if в цикл и это будет выглядеть не сильно хуже, чем filter/reduce. Оно скомпилируется один раз и заоптимизируется
А comprehension-то как на это влияет? Я не понимаю связи всех ваших утверждений :(
Тем, что он не нужен. Нигде кроме питона в нем нет смысла
но взяли его из Haskell.. (ладно, я не знаю, мб в хаскеле он совсем другой смысл несёт) Получается так: он делает всё то же, что конструкции, которые нужны, только не нужен. Непонятно
Проблема collection comperhension в том, что он страшный. Фильтр слева, действие справа, переменная посередине. Это не фича, это баг.
а. Так понятно. Но это уже вкусовщина
Не совсем правда! В хаскелле стандарт - это map, filter, reduce.
Если обсуждать не как оно устроено, а почему, то нет, не вкусовщина. В питоне оно так, потому что никак по другому не получалось. Это ограничение.
Можно так все решения по дизайну Котлина принять как вкусовщину.
какие-то точно можно)
Обсуждают сегодня