Reverse Compose: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
(monadic: hook)
No edit summary
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|⍛}}, 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>.


Reverse compose was introduced in [[Extended Dyalog APL]], and then adopted into [[dzaima/APL]]. Its [[dyadic]] case matches [[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 [[precedence]] order is left to right, it considers the "reversed" APL form to be primary. The [[monadic]] case was discussed for a while in the [[APL Orchard]]. To be completely consistent with the other [[compositional operators|function composition]], the left "leg" would be removed, making <source lang=apl inline>f⍛g Y</source> be equivalent to <source lang=apl inline>g Y</source>. However, this would never apply <source lang=apl inline>f</source> and would questionably be called a ''composition'' of <source lang=apl inline>f</source> and <source lang=apl inline>g</source>. Instead, it was concluded that the best solution would be to have <source lang=apl inline>f⍛g Y</source> be a [[hook]], <source lang=apl inline>f⍛g⍨Y</source>, that is, <source lang=apl inline>f⍛g</source>{{←→}}<source lang=apl inline>f⍛g⍨⍨</source>.
Reverse compose was introduced in [[Extended Dyalog APL]], and then adopted into [[dzaima/APL]]. Its [[dyadic]] case matches [[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 [[precedence]] order is left to right, it considers the "reversed" APL form to be primary. The [[monadic]] case was discussed for a while in the [[APL Orchard]]. To be completely consistent with the other [[compositional operators|function composition]], the left "leg" would be removed, making <source lang=apl inline>f⍛g Y</source> be equivalent to <source lang=apl inline>g Y</source>. However, this would never apply <source lang=apl inline>f</source> and would questionably be called a ''composition'' of <source lang=apl inline>f</source> and <source lang=apl inline>g</source>. Instead, it was concluded that the best solution would be to have <source lang=apl inline>f⍛g Y</source> be a [[hook]], <source lang=apl inline>f⍛g⍨Y</source>, that is, <source lang=apl inline>f⍛g</source>{{←→}}<source lang=apl inline>f⍛g⍨⍨</source>{{←→}}<source lang=apl inline>g⍨∘f⍨</source>.


== Common usage ==
== Common usage ==

Revision as of 08:56, 23 May 2022

Reverse Compose (), also known as Before, is a primitive operator closely related to Beside (), also known as After. 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 {(⍺⍺ ) ⍵⍵ }.

Reverse compose was introduced in Extended Dyalog APL, and then adopted into dzaima/APL. Its dyadic case matches I's Hook (h), which is a reflected form of a J Hook, while Backhook (H) matches the ordinary Hook or Compose: because I's precedence order is left to right, it considers the "reversed" APL form to be primary. The monadic case was discussed for a while in the APL Orchard. To be completely consistent with the other function composition, the left "leg" would be removed, making fg Y be equivalent to g Y. However, this would never apply f and would questionably be called a composition of f and g. Instead, it was concluded that the best solution would be to have fg Y be a hook, fgY, that is, fg fg⍨⍨ g⍨∘f.

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
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