В 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
не кажется мне эффективным. Возможно, есть способ сделать это, не прибегая к этому.