Reduce: Difference between revisions
Jump to navigation
Jump to search
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</ | {{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</ | 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 | ||
</ | </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</ | 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│ | ||
└──────────────────────────────────────────┘ | └──────────────────────────────────────────┘ | ||
</ | </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 | ||
</ | </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. |