Size: a a a

Clojure — русскоговорящее сообщество

2021 March 21

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
правда тут коллекция одним параметром идет
как в самом nil-safe-aggr
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
я бы записал как-то так
(def nil-safe-max #(transduce (remove nil?) max Integer/MIN_VALUE %))
(def nil-safe-min #(transduce (remove nil?) min Integer/MAX_VALUE %))
такое можно просто в коде, без промежуточной функции
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
Уф, осталось только трансдюсеры освоить 😁 спасибо, буду разбираться
и удалять, наверное, надо всё, что не number?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
и удалять, наверное, надо всё, что не number?
как-то так
(transduce (filter number?) max Integer/MIN_VALUE [1 2 3 nil 4 5 "123"])
источник

A

Andrey in Clojure — русскоговорящее сообщество
Sergey Trofimov
и удалять, наверное, надо всё, что не number?
В идеале, да. В моей локальной задаче это едва ли возможно, но я понял, лучше (remove nil?) заменить на (filter number?)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
В идеале, да. В моей локальной задаче это едва ли возможно, но я понял, лучше (remove nil?) заменить на (filter number?)
ну, у кого-то в локальной задаче и nil неоткуда взяться 😊
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
Уф, осталось только трансдюсеры освоить 😁 спасибо, буду разбираться
ну и есть отличие, что требуется соответствующее стартовое значение, не будет nil если на входе нет чисел
источник

A

Andrey in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну и есть отличие, что требуется соответствующее стартовое значение, не будет nil если на входе нет чисел
Тут уже от задачи зависит. Где-то может быть странным получить на выходе число, если на входе была коллекция из nil
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
Тут уже от задачи зависит. Где-то может быть странным получить на выходе число, если на входе была коллекция из nil
в общем можно и извратиться
  (transduce (filter number?) 
            (completing max #(when-not (= Integer/MIN_VALUE %) %))
            Integer/MIN_VALUE
            [nil 1 "xxx"])


я не придумал, что такое должно быть max без параметров
это нужно хитрую обёртку над max писать
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
Тут уже от задачи зависит. Где-то может быть странным получить на выходе число, если на входе была коллекция из nil
ещё может быть странным получить nil, если на входе была непустая коллекция чего-то
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
Тут уже от задачи зависит. Где-то может быть странным получить на выходе число, если на входе была коллекция из nil
тогда получается так, хотя это и медленнее
(some->> [1 2 3 nil 4 5 "123"] (filter number?) (seq) (reduce max))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
тогда получается так, хотя это и медленнее
(some->> [1 2 3 nil 4 5 "123"] (filter number?) (seq) (reduce max))
как у тебя в начале было, только reduce вместо apply
источник

A

Andrey in Clojure — русскоговорящее сообщество
а тут разве какая-то разница между apply и reduce есть?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
а тут разве какая-то разница между apply и reduce есть?
15% производительности 😊
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey
а тут разве какая-то разница между apply и reduce есть?
и если я не путаю, apply работает над предварительно собранной промежуточной коллекцией
а reduce пошагово отрабатывает
должно быть и по памяти эффективней
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну и max мультиарный медленнее, чем попарно
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
и редукцию распараллелить можно
источник

ap

andei papkov in Clojure — русскоговорящее сообщество
поскажите как распаралелить правильно вычисления, я получается создаю список задач, после делю c partition-all
и в итоге всё равно бегаю рекурсией, можно ли обойтись средствами clojure без рекурсии:

 requests-parts (partition-all 2 requests)]
 ...
 (thread
   (loop [parts requests-parts]
     (when-some [p (first parts)]
       (doall (map deref p))
       (recur (rest parts)))))
источник

ap

andei papkov in Clojure — русскоговорящее сообщество
requests - ленивая последовательность содержит future, хочется ограничить 2мя потоками
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
А зачем эти танцы с бубном если каждый future выполняется в своем треде? Просто сделать (mapv deref requests)
источник