Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>>
LCR>LCR>foldl =: monad define
LCR> 'v a l' =. y
LCR> ll =. l , a
LCR> ". v , '/' , (5!:5) <'ll'
LCR>)
LCR>
LCR>Присутствует лёгкое неудовлетворение от кривого использования '".' Так будет лучше:
LCR>LCR>foldl =: monad define
LCR> 'v a l' =. y
LCR> ". 'u =. ', v
LCR> u / l , a
LCR>)
LCR> foldl '+' ; 11; i.10
LCR>56
LCR>
По-моему тут использование наречия напрашивается. Типа:
foldr =: 1 : (':' ; 'u / y , x')
(6 - foldr i.4) -: (0 - (1 - (2 - (3 - 6))))
1
NB. вычисление в J идет справа налево, поэтому foldl немного сложнее
foldl =: 1 : (':' ; 'u~ / (|. y) , x')
(6 - foldl i.4) -: ((((6 - 0) - 1) - 2) - 3)
1
Недостаток тут в том, что тип функции должен совпадать с типом элементов массива. Что в общем не всегда верно.
Как обычно бокс спешит на помощь. Типа:
boxme =: 1 : (':' ; '> (<x) u (<"_1 y)')
foldr2 =: each foldr boxme
foldl2 =: each foldl boxme
sum_of_chars =: + a. i. ]
0 sum_of_chars foldl 'ABCD'
|domain error
| u~/(|.y) ,x
0 sum_of_chars foldl2 'ABCD'
266
0 sum_of_chars~ foldr2 'ABCD'
266
Но вообще подобные вопросы возникают от попыток перенести идиомы из невекторного языка в J в лоб. И при этом часто пропадает весь смысл использования языка. Ни эффективности, ни лаконичности кода. Надо стараться избавляться от старых привычек и стремиться использовать богатый арсенал примитивных векторных операций на максимально высоких рангах, плюс "выращивание" более сложных конструкций путем тацитной композиции.
--
Mikl