Keep It Simple, Stupid PerlMonks

### Re: RFC: Should join subsume reduce?

by nothingmuch (Priest)
 on Feb 24, 2006 at 00:49 UTC ( #532433=note: print w/ replies, xml ) Need Help??

in reply to RFC: Should join subsume reduce?

reduce is also known fold, and foldr and foldl can be used to implement any of grep, map, join, sum, etc etc etc.

In Haskell Perl's join can be reimplemented as this:

join _ [] = [] -- this means that join on the empty list is the empty
+string
join delim strings = foldl1 (\left right -> left ++ delim ++ right ) s
+trings -- this is join implemented with reduce

-- also this could be written as
join delim strings = foldl1 ((++) . (++ delim)) strings

-- or more perlishly
join delim strings = foldl1 (\left right -> concat [left, delim, right
+]) strings

-- or with autocurrying fun
join = foldl1 . ((++) .) . flip (++)
[download]
And and similarly we can implement this with List::Util's reduce very elegantly too:
sub join {
my ( $delim, @strings ) = @_; reduce {$a . $delim .$b } @strings;
}
but in this case the concatenation operator is not used directly as th
+e a curried higher order function
[download]
A tutorial on the universality and expressiveness of fold is a wonderful article on this topic. There are some diagrams to assist you in understanding the article, too.

Since you seemed to like to reference c2.com, see The Wheel Gets Reinvented.

Lastly, the argument that adding reduce to Perl will break code is wrong - err, lock and others were added post factum as weak keywords - keywords that are only available if there is no sub by that name in the current package already.

-nuffin
zz zZ Z Z #!perl

Create A New User
Node Status?
node history
Node Type: note [id://532433]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (8)
As of 2016-06-29 11:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
My preferred method of making French fries (chips) is in a ...

Results (377 votes). Check out past polls.