Reduce: Difference between revisions

Jump to navigation Jump to search
117 bytes added ,  22:10, 10 September 2022
m
Text replacement - "</source>" to "</syntaxhighlight>"
m (Text replacement - "<source" to "<syntaxhighlight")
m (Text replacement - "</source>" to "</syntaxhighlight>")
Line 1: Line 1:
{{Built-ins|Reduce|/|⌿}}, also called '''Reduction''' or '''Insert''', is a [[primitive operator|primitive]] [[monadic operator]] which takes a [[dyadic function]] [[operand]], inserts it between the [[element|elements]] of the [[argument]], and evaluates it into a single array in right-to-left order. This operation is known as [[wikipedia:Fold (higher-order function)|Fold]], or more specifically <syntaxhighlight lang=text inline>foldr1</source>, in other functional programming languages such as Haskell.
{{Built-ins|Reduce|/|⌿}}, also called '''Reduction''' or '''Insert''', is a [[primitive operator|primitive]] [[monadic operator]] which takes a [[dyadic function]] [[operand]], inserts it between the [[element|elements]] of the [[argument]], and evaluates it into a single array in right-to-left order. This operation is known as [[wikipedia:Fold (higher-order function)|Fold]], or more specifically <syntaxhighlight lang=text inline>foldr1</syntaxhighlight>, in other functional programming languages such as Haskell.


== Description ==
== Description ==


When applied to a [[vector]] argument, <syntaxhighlight lang=apl inline>f/x</source> evaluates to the expression <syntaxhighlight lang=text inline>a f b f c f d …</source> where <syntaxhighlight lang=text inline>a, b, c, d, …</source> are the elements of <syntaxhighlight lang=text inline>x</source>. In general, Reduce reduces one chosen [[axis]] (either implied by using the last-axis form <syntaxhighlight lang=apl inline>f/</source> or first-axis <syntaxhighlight lang=apl inline>f⌿</source>, or explicitly by using [[function axis]] <syntaxhighlight lang=apl inline>f/[x]</source>) by evaluating each [[vector]] along the chosen axis into a [[scalar]].
When applied to a [[vector]] argument, <syntaxhighlight lang=apl inline>f/x</syntaxhighlight> evaluates to the expression <syntaxhighlight lang=text inline>a f b f c f d …</syntaxhighlight> where <syntaxhighlight lang=text inline>a, b, c, d, …</syntaxhighlight> are the elements of <syntaxhighlight lang=text inline>x</syntaxhighlight>. In general, Reduce reduces one chosen [[axis]] (either implied by using the last-axis form <syntaxhighlight lang=apl inline>f/</syntaxhighlight> or first-axis <syntaxhighlight lang=apl inline>f⌿</syntaxhighlight>, or explicitly by using [[function axis]] <syntaxhighlight lang=apl inline>f/[x]</syntaxhighlight>) by evaluating each [[vector]] along the chosen axis into a [[scalar]].


In [[nested array model]], Reduce has a strong property that the reduced axis is removed from the [[shape]] of the argument, which forces it to [[enclose]] each non-[[simple]] result in the returned array.
In [[nested array model]], Reduce has a strong property that the reduced axis is removed from the [[shape]] of the argument, which forces it to [[enclose]] each non-[[simple]] result in the returned array.
Line 22: Line 22:
       ÷/1 2 3 4 5
       ÷/1 2 3 4 5
1.875
1.875
</source>
</syntaxhighlight>


Reduction by [[Minimum]] or [[Maximum]] gives the minimum or maximum over several numbers. Same goes for [[And]], [[Or]], [[GCD]], [[LCM]], and XOR ([[Not Equal]] on [[Booleans]]).
Reduction by [[Minimum]] or [[Maximum]] gives the minimum or maximum over several numbers. Same goes for [[And]], [[Or]], [[GCD]], [[LCM]], and XOR ([[Not Equal]] on [[Booleans]]).


Although Reduce is <syntaxhighlight lang=text inline>foldr1</source> in nature, one can use it like <syntaxhighlight lang=text inline>foldr</source>, where a designated starting value is modified by the rest of the values in sequence. In this case, the start value (enclosed if not a [[simple scalar]]) is attached to the right end of the [[vector]] of "modifiers", and then the entire vector is reduced.
Although Reduce is <syntaxhighlight lang=text inline>foldr1</syntaxhighlight> in nature, one can use it like <syntaxhighlight lang=text inline>foldr</syntaxhighlight>, where a designated starting value is modified by the rest of the values in sequence. In this case, the start value (enclosed if not a [[simple scalar]]) is attached to the right end of the [[vector]] of "modifiers", and then the entire vector is reduced.


<syntaxhighlight lang=apl>
<syntaxhighlight lang=apl>
Line 39: Line 39:
│1 0.9682458366 0.8660254038 0.6614378278 0│
│1 0.9682458366 0.8660254038 0.6614378278 0│
└──────────────────────────────────────────┘
└──────────────────────────────────────────┘
</source>
</syntaxhighlight>


Reduction over an empty axis gives the [[identity element]] of the operand.
Reduction over an empty axis gives the [[identity element]] of the operand.
Line 49: Line 49:
0 0 0
0 0 0
0 0 0
0 0 0
</source>
</syntaxhighlight>


[[FinnAPL idiom library]] contains over 100 entries which use Reduce in some way.
[[FinnAPL idiom library]] contains over 100 entries which use Reduce in some way.

Navigation menu