Re: Усовершенствованная версия foldl
От: Mikl Kurkov Россия  
Дата: 04.05.07 20:56
Оценка: 6 (1) +1
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.