Reverse Compose: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
mNo edit summary
(Rewrite and simplify discussion of monadic case)
(6 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{Built-in|Reverse Compose|⍛}}, also known as '''Before''', is a [[primitive operator]] closely related to [[Beside]] (<source lang=apl inline>∘</source>), also known as ''After''. Called [[dyad|dyadically]] with function operands <source lang=apl inline>f</source> and <source lang=apl inline>g</source>, it uses <source lang=apl inline>f</source> [[monad|monadically]] to pre-processes the left argument before applying <source lang=apl inline>g</source> between the pre-processed left argument and the given right argument. <source lang=apl inline>X f⍛g Y</source> is thus equivalent to <source lang=apl inline>(f X) g Y</source>. The operator can be defined as the [[dop]] <source lang=apl inline>{(⍺⍺ ⍺) ⍵⍵ ⍵}</source>.
{{Built-in|Reverse Compose|⍛}} is a [[primitive operator]] closely related to [[Beside]] (<source lang=apl inline>∘</source>), which appears in [[Extended Dyalog APL]] and [[dzaima/APL]]. Called [[dyad|dyadically]] with function operands <source lang=apl inline>f</source> and <source lang=apl inline>g</source>, it uses <source lang=apl inline>f</source> [[monad|monadically]] to pre-processes the left argument before applying <source lang=apl inline>g</source> between the pre-processed left argument and the given right argument. <source lang=apl inline>X f⍛g Y</source> is thus equivalent to <source lang=apl inline>(f X) g Y</source>. The operator can be defined as the [[dop]] <source lang=apl inline>{(⍺⍺ ⍺) ⍵⍵ ⍵}</source>. This dyadic definition matches the [[hook]] function Before, represented as <code>⊸</code> in [[BQN]].


Reverse compose was introduced in [[Extended Dyalog APL]], and then adopted into [[dzaima/APL]]. Its [[dyadic]] case matches to [[I]]'s Hook (<code>h</code>), which is a reflected form of a [[J]] [[Hook]], while Backhook (<code>H</code>) matches the ordinary [[Hook]] or [[Compose]]: because I's [[evaluation order]] is left to right, it considers the "reversed" APL form to be primary.
Unlike Before, the [[monad]]ic case of Reverse Compose has differed across implementations. When introduced by [[Extended Dyalog APL]], <source lang=apl inline>f⍛g Y</source> evaluated to <source lang=apl inline>g Y</source>, but [[Adám Brudzewsky|Brudzewsky]]'s later Dyalog APL Vision defines<ref>[https://github.com/abrudz/dyalog_vision/blob/main/JotUnderbar.aplo JotUnderbar.aplo]</ref> it to be <source lang=apl inline>Y f g Y</source>, matching Before. This later definition might also be written <source lang=apl inline>f⍛g</source>{{←→}}<source lang=apl inline>f⍛g⍨⍨</source>{{←→}}<source lang=apl inline>g⍨∘f⍨</source>. In [[dzaima/APL]] the monadic case is simply an error.


== Common usage ==
== Common usage ==
Line 11: Line 11:
</source>{{Works in|[[dzaima/APL]], [[Extended Dyalog APL]]}}
</source>{{Works in|[[dzaima/APL]], [[Extended Dyalog APL]]}}


It can also be combined with Beside to create the [[split-compose]] construct. Here, we take the [[sign]] of the left argument and apply it to the absolute value of the right argument:
It can also be combined with Beside to create the [[split-compose]] construct. Here, we take the [[sign]] of the left argument and apply it to (that is, multiply it with) the absolute value of the right argument:
[https://tio.run/##SyzI0U2pSszMTfz//1Hf1EdtE4wVDq03VDA5PP1R72wg0TGj5tB6I6CYuYLh//8A Try it online!]<source lang=apl>
[https://tio.run/##SyzI0U2pSszMTfz//1Hf1EdtE4wVDq03VDA5PP1R72wg0TGj5tB6I6CYuYLh//8A Try it online!]<source lang=apl>
       3 ¯1 4×⍛×∘|¯2 ¯7 1
       3 ¯1 4×⍛×∘|¯2 ¯7 1
2 ¯7 1
2 ¯7 1
</source>{{Works in|[[dzaima/APL]], [[Extended Dyalog APL]]}}
</source>{{Works in|[[dzaima/APL]], [[Extended Dyalog APL]]}}
== References ==
<references/>
{{APL built-ins}}[[Category:Primitive operators]][[Category:Composition operators]]
{{APL built-ins}}[[Category:Primitive operators]][[Category:Composition operators]]

Revision as of 13:44, 27 May 2022

Reverse Compose () is a primitive operator closely related to Beside (), which appears in Extended Dyalog APL and dzaima/APL. Called dyadically with function operands f and g, it uses f monadically to pre-processes the left argument before applying g between the pre-processed left argument and the given right argument. X fg Y is thus equivalent to (f X) g Y. The operator can be defined as the dop {(⍺⍺ ) ⍵⍵ }. This dyadic definition matches the hook function Before, represented as in BQN.

Unlike Before, the monadic case of Reverse Compose has differed across implementations. When introduced by Extended Dyalog APL, fg Y evaluated to g Y, but Brudzewsky's later Dyalog APL Vision defines[1] it to be Y f g Y, matching Before. This later definition might also be written fg fg⍨⍨ g⍨∘f. In dzaima/APL the monadic case is simply an error.

Common usage

Its plain usage is to pre-process left arguments without needing one or more applications of Commute (). For example, the square of the left argument minus the right argument can be expressed as:

Try it online!

      3×⍨⍛-2
7

It can also be combined with Beside to create the split-compose construct. Here, we take the sign of the left argument and apply it to (that is, multiply it with) the absolute value of the right argument:

Try it online!

      3 ¯1 4××|¯2 ¯7 1
2 ¯7 1

References

APL built-ins [edit]
Primitive functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentitySelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndex
Selector Index generatorGradeIndex OfInterval IndexIndicesDeal
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Primitive operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductPowerAtUnderRankDepthVariantStencilCut (J)
Quad names
Arrays Index originMigration levelAtomic vector
Functions Name classCase convertUnicode convert
Operators SearchReplace