Split composition: Difference between revisions
mNo edit summary |
(Editing; use source blocks) |
||
Line 1: | Line 1: | ||
'''Split-compose''' is a point-free construct, used to pre-process | '''Split-compose''' is a point-free construct, used to pre-process its argument(s) with the left and right-most operand before applying the middle operand between the result. | ||
Given functions <source lang=apl inline>F</source>, <source lang=apl inline>G</source>, and <source lang=apl inline>H</source>, the split composition on arguments <source lang=apl inline>x</source> and <source lang=apl inline>y</source> is defined as <source lang=apl inline>(F x) G (H y)</source>. | |||
In BQN, the construct can be formed using [[Before]] <code> | In [[BQN]], the construct can be formed using [[Before]] (<code>⊸</code>) and [[After]] (<code>⟜</code>), two [[Function composition|compositional]] [[operator]]s. In this example, we multiply the range of the left argument, with the absolute value of the right. | ||
<source> | |||
5 ↕⊸×⟜| 5‿¯8‿¯2‿¯5‿3 | |||
⟨ 0 8 4 15 12 ⟩ | |||
</source> | |||
[[Monadic]]ally, the right argument can be [[selfie|duplicated]] and split-compose will be applied asymmetrically, similar to [[hook]] | [[Monadic]]ally, the right argument can be [[selfie|duplicated]] and split-compose will be applied asymmetrically, similar to [[hook]] | ||
<source> | |||
+´⊸÷⟜≠ ↕10 | |||
⟨ 4.5 ⟩ | |||
# This is evaluated as (↕10) +´⊸÷⟜≢ ↕10 | |||
</source> | |||
Monadically, split-compose is precisely equivalent to a [[fork]]. | Monadically, split-compose is precisely equivalent to a [[fork]]. | ||
<source> | |||
(+´÷≠) ↕10 | |||
4.5 | |||
</source> | |||
Line 23: | Line 29: | ||
In [[Dyalog APL]] you may form the expression with [[Beside]] <code>(∘)</code> and [[Commute]] <code>(⍨)</code> | In [[Dyalog APL]] you may form the expression with [[Beside]] <code>(∘)</code> and [[Commute]] <code>(⍨)</code> | ||
<source lang=apl> | |||
g∘h⍨∘f⍨ | |||
g⍨∘f⍨∘h⍨⍨ | |||
</source> | |||
For example: | For example: | ||
<source lang=apl> | |||
÷⍨∘(+/)⍨∘≢⍨⍨ ⍳10 | |||
4.5 | |||
</source> | |||
Whilst these expressions will return the same results (if the functions f,g, | Whilst these expressions will return the same results (if the functions f, g, and h are pure) the evaluation order is not identical. | ||
And (most commonly) as a fork: | And (most commonly) as a fork: | ||
<source lang=apl> | |||
f⍤⊣ g h⍤⊢ | |||
</source> | |||
== See also == | == See also == |
Revision as of 13:51, 12 April 2022
Split-compose is a point-free construct, used to pre-process its argument(s) with the left and right-most operand before applying the middle operand between the result.
Given functions F
, G
, and H
, the split composition on arguments x
and y
is defined as (F x) G (H y)
.
In BQN, the construct can be formed using Before (⊸
) and After (⟜
), two compositional operators. In this example, we multiply the range of the left argument, with the absolute value of the right.
5 ↕⊸×⟜| 5‿¯8‿¯2‿¯5‿3 ⟨ 0 8 4 15 12 ⟩
Monadically, the right argument can be duplicated and split-compose will be applied asymmetrically, similar to hook
+´⊸÷⟜≠ ↕10 ⟨ 4.5 ⟩ # This is evaluated as (↕10) +´⊸÷⟜≢ ↕10
Monadically, split-compose is precisely equivalent to a fork.
(+´÷≠) ↕10 4.5
In dialects that lack Before, split-compose can be defined differently.
In Dyalog APL you may form the expression with Beside (∘)
and Commute (⍨)
g∘h⍨∘f⍨ g⍨∘f⍨∘h⍨⍨
For example:
÷⍨∘(+/)⍨∘≢⍨⍨ ⍳10 4.5
Whilst these expressions will return the same results (if the functions f, g, and h are pure) the evaluation order is not identical.
And (most commonly) as a fork:
f⍤⊣ g h⍤⊢
See also