Each: Difference between revisions

Jump to navigation Jump to search
333 bytes added ,  22:16, 10 September 2022
m
Text replacement - "</source>" to "</syntaxhighlight>"
(Notability is a requirement to be on the wiki, calling things "notable" is useless)
m (Text replacement - "</source>" to "</syntaxhighlight>")
Tags: Mobile edit Mobile web edit
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{Built-in|Each|¨}} is a [[primitive operator|primitive]] [[monadic operator]] which applies its [[operand]] to each [[element]] of the [[argument]]s, and returns an array whose elements are the results. If two arguments are given, their elements are matched using [[conformability]] rules.
{{Built-in|Each|¨}} is a [[primitive operator|primitive]] [[monadic operator]] which applies its [[operand]] to each [[element]] of the [[argument]]s, and returns an array whose elements are the results. If two arguments are given, their elements are matched using [[conformability]] rules.
== Definition ==
== Definition ==
Each is defined only in [[Nested array model|nested]] APLs. Some [[Flat array model|flat]] APLs obtain analogous functionality by using an [[Under]] operator with [[close composition]] along with the [[Function rank|rank]]-0 function [[Disclose]] (or Unbox). In [[SHARP APL]] this is written <source lang=apl inline>f¨></source>. In [[J]] it is <source lang=j inline>f&.></source>.
Each is defined only in [[Nested array model|nested]] APLs. Some [[Flat array model|flat]] APLs obtain analogous functionality by using an [[Under]] operator with [[close composition]] along with the [[Function rank|rank]]-0 function [[Disclose]] (or Unbox). In [[SHARP APL]] this is written <syntaxhighlight lang=apl inline>f¨></syntaxhighlight>. In [[J]] it is <syntaxhighlight lang=j inline>f&.></syntaxhighlight>.


Each differs from the [[Rank operator]] with rank 0 in that the operand arguments and results are not [[enclose]]d. As the [[elements]] of a nested array they need not be [[scalar]].
Each differs from the [[Rank operator]] with rank 0 in that the operand arguments and results are not [[enclose]]d. As the [[elements]] of a nested array they need not be [[scalar]]. <syntaxhighlight lang=apl inline>f¨</syntaxhighlight> can therefore be defined as <syntaxhighlight lang=apl inline>⊂⍤f⍥⊃⍤0</syntaxhighlight>.


The Each operator has no effect on [[scalar function]]s, since these functions already map over each array element. For example, both expressions below have the same meaning, since <source lang=apl inline>+</source> is a scalar function.
The Each operator has no effect on [[scalar function]]s, since these functions already map over each array element. For example, both expressions below have the same meaning, since <syntaxhighlight lang=apl inline>+</syntaxhighlight> is a scalar function.
<source lang=apl>
<syntaxhighlight lang=apl>
       1 + 1 2 3 4
       1 + 1 2 3 4
2 3 4 5
2 3 4 5
       1 +¨ 1 2 3 4
       1 +¨ 1 2 3 4
2 3 4 5
2 3 4 5
</source>
</syntaxhighlight>


== Examples ==
== Examples ==
<source lang=apl>
<syntaxhighlight lang=apl>
       1,1 2 3 ⍝ join 1 with 1 2 3
       1,1 2 3 ⍝ join 1 with 1 2 3
1 1 2 3
1 1 2 3
Line 31: Line 31:
│cba│fed│ihg│
│cba│fed│ihg│
└───┴───┴───┘
└───┴───┴───┘
</source>
</syntaxhighlight>


=== Mapping ===
=== Mapping ===
It is very common to pair up an entire array with each element of a different array. There are two common ways to do this using Each. The first is to [[enclose]] the argument that is to be used as a whole for each element of the other array:
It is very common to pair up an entire array with each element of a different array. There are two common ways to do this using Each. The first is to [[enclose]] the argument that is to be used as a whole for each element of the other array:
<source lang=apl>
<syntaxhighlight lang=apl>
       (⊂10 20 30),¨1 2 3  ⍝ Computes (10 20 30,1)(10 20 30,2)(10 20 30,3)
       (⊂10 20 30),¨1 2 3  ⍝ Computes (10 20 30,1)(10 20 30,2)(10 20 30,3)
┌──────────┬──────────┬──────────┐
┌──────────┬──────────┬──────────┐
Line 44: Line 44:
│10 1 2 3│20 1 2 3│30 1 2 3│
│10 1 2 3│20 1 2 3│30 1 2 3│
└────────┴────────┴────────┘
└────────┴────────┴────────┘
</source>
</syntaxhighlight>
The other method is by [[bind]]ing the argument that is to be used as a whole to the function, deriving a monadic function, which is then applied using Each:
The other method is by [[bind]]ing the argument that is to be used as a whole to the function, deriving a monadic function, which is then applied using Each:
<source lang=apl>
<syntaxhighlight lang=apl>
       10 20 30∘,¨1 2 3  ⍝ Computes (10 20 30,1)(10 20 30,2)(10 20 30,3)
       10 20 30∘,¨1 2 3  ⍝ Computes (10 20 30,1)(10 20 30,2)(10 20 30,3)
┌──────────┬──────────┬──────────┐
┌──────────┬──────────┬──────────┐
Line 55: Line 55:
│10 1 2 3│20 1 2 3│30 1 2 3│
│10 1 2 3│20 1 2 3│30 1 2 3│
└────────┴────────┴────────┘
└────────┴────────┴────────┘
</source>
</syntaxhighlight>
Note how binding a right argument derives a monadic function which still takes its single argument on the right.
Note how binding a right argument derives a monadic function which still takes its single argument on the right.
=== Selecting ===
=== Selecting ===
An enclosed array is a [[scalar]], which is subject to [[scalar extension]]. This can be used to simulate [[Outer Product|outer product]] by a one-sided Each (pair the entire right argument with each element of the left argument, or vice versa). An application of this behavior is the "chipmunk idiom" <source lang=apl inline>X⊃¨⊂Y</source>, which simulates <source lang=apl inline>Y[X]</source> for (possibly nested) [[vector]] Y and [[simple]] X:
An enclosed array is a [[scalar]], which is subject to [[scalar extension]]. This can be used to simulate [[Outer Product|outer product]] by a one-sided Each (pair the entire right argument with each element of the left argument, or vice versa). An application of this behavior is the "chipmunk idiom" <syntaxhighlight lang=apl inline>X⊃¨⊂Y</syntaxhighlight>, which simulates <syntaxhighlight lang=apl inline>Y[X]</syntaxhighlight> for (possibly nested) [[vector]] Y and [[simple]] X:


<source lang=apl>
<syntaxhighlight lang=apl>
       (2 2⍴1 2 2 1)⊃¨⊂(1 2)(3 4)(5 6)  ⍝ Computes (1 2)(3 4)(5 6)[2 2⍴1 2 2 1]
       (2 2⍴1 2 2 1)⊃¨⊂(1 2)(3 4)(5 6)  ⍝ Computes (1 2)(3 4)(5 6)[2 2⍴1 2 2 1]
┌───┬───┐
┌───┬───┐
Line 67: Line 67:
│3 4│1 2│
│3 4│1 2│
└───┴───┘
└───┴───┘
</source>
</syntaxhighlight>


== External links ==
== External links ==

Navigation menu