Может ли сопоставление с образцом в do-notation / enumFromTo замедлить код на Haskell?

Нет, ссылки на методы не поддерживают цепочку. В вашем примере не ясно, какой из двух методов должен получить второй параметр.


Но если вы настаиваете на этом ...

static <V,T,U> BiConsumer<V,U> filterFirstArg(BiConsumer<T,U> c, Function<V,T> f) {
    return (t,u)->c.accept(f.apply(t), u);
}

...

BiConsumer<MyBean, String> c = filterFirstArg(List::add, MyBean::getList);

Именование метода предполагает его просмотр как взятие существующего BiConsumer (здесь List.add) и добавление функции (здесь MyBean.getList()) к ее первому аргументу. Легко представить, как выглядит эквивалентный метод утилиты для фильтрации второго аргумента или обоих сразу.

Однако он в основном полезен для объединения существующих реализаций с другой операцией. В вашем конкретном примере сайт-сайт не лучше обычного лямбда-выражения

BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);
0
задан Zhiltsoff Igor 6 March 2019 в 19:13
поделиться

2 ответа

Изменение вашего True <- return $ (l - 1 <= n) на True <- return $ (l <= n), чтобы соответствовать тому, что делает первый фрагмент, уравнивает время двух для меня (без изменения ответа).

Без этого изменения ваш второй фрагмент кода тратит впустую много времени, пытаясь найти убывающие последовательности длины l среди чисел [1..l-1] (для многих различных значений l), обреченная задача.

0
ответ дан Daniel Wagner 6 March 2019 в 19:13
поделиться

Кажется, что две функции имеют совершенно разную реализацию:

c m l = do
      n   <- [l..m]
      res <- c (n - 1) (l - 1)
      return $ n:res

Здесь при каждом рекурсивном вызове параметр l уменьшается, а параметр m становится n <- [l--m]. 1118]

Для сравнения:

helper a b l = do
    n    <- [a..b]
    True <- return $ (l - 1 <= n)
    res  <- helper a (n - 1) (l - 1)
    return (n:res)

Здесь интервал составляет [a..b] вместо [l..m] (кстати, почему вы используете разные имена? Сложнее сравнивать два фрагмента таким образом. Итак, рассмотрим, как изменяются параметры a и b. Параметр a не изменяется, а b становится n-1.

Есть также третий аргумент l, которого не было в первом фрагменте.

Я не вижу, как это будет тот же алгоритм. Это выглядит совершенно по-другому для меня. Вы, вероятно, вызываете здесь более рекурсивные вызовы, которые замедляют работу. Сопоставление с образцом - это красная сельдь - думаю, дело не в том, что это тормозит, по крайней мере, не напрямую.

Кроме того, эта часть

    n    <- [a..b]
    True <- return $ (l - 1 <= n)

выглядит очень подозрительно. Это должно быть что-то вроде

    n    <- [max a (l-1) .. b]

, поскольку вышеприведенное будет учитываться от a до l-2 только для того, чтобы отбросить эти варианты в следующей строке. Создание вариантов только для того, чтобы отказаться от них, может замедлить вашу программу.

0
ответ дан chi 6 March 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: