Какой самый эффективный способ реализовать Foldl1 Haskell в J?

В Haskell есть две функции, которые позволяют выполнять операцию над списком элементов, чтобы сократить его до одного (Конечно, их больше двух, но именно эти два меня интересуют.) Это foldl1 и foldr1 . Если операция, которую нужно выполнить, будет коммутативной (например, сложение), не имеет значения, какой из них вы используете. Результат будет тем же. Однако, если операция не коммутативная (например, вычитание), тогда они дают очень разные результаты. Например:

foldr1 (-) [1..9]
foldl1 (-) [1..9]

Ответ на первый вопрос - 5, а на второй - -43. J-эквивалент foldr1 - это наречие вставки, / , например,

-/ 1+i.9

, которое эквивалентно foldr1 (-) [1..9] . Я хочу создать наречие в J, которое работает как наречие вставки, но складывается влево, а не вправо. Лучшее, что я смог придумать, это следующее:

foldl =: 1 : 'u~/@|.'

Таким образом, можно было бы сказать:

- foldl 1+i.9

и получить -43 в качестве ответа, что и ожидается от левого фолда.

Есть ли лучший способ сделать это. сделать это в J? По какой-то причине изменение аргумента y не кажется мне эффективным. Возможно, есть способ сделать это, не прибегая к этому.

5
задан Gregory Higley 6 March 2011 в 04:38
поделиться