4,500
edits
(→Close composition: Move ¨> description from history section) |
No edit summary |
||
Line 1: | Line 1: | ||
{{Built-in|Under|⍢}}, or '''Dual''' (< | {{Built-in|Under|⍢}}, or '''Dual''' (<source lang=apl inline>¨</source>), is a [[primitive operator|primitive]] [[dyadic operator]] which takes two [[function]] [[operand]]s. It pre-processes its argument(s) with the monadic right operand, before applying the left operand on/between the result(s), then undoing the pre-processing.<ref>[https://mlochbaum.github.io/BQN/help/under.html BQN: Circle Jot (⌾)]</ref> | ||
== Model == | == Model == | ||
In dialects that support user-defined operators and invertible functions, it can be defined as (or similar): | In dialects that support user-defined operators and invertible functions, it can be defined as (or similar): | ||
<source lang=apl> _U_ ← {⍺←{⍵ ⋄ ⍺⍺} ⋄ ⍵⍵⍣¯1⊢(⍵⍵ ⍺)⍺⍺(⍵⍵ ⍵)}</source> | |||
== Examples == | == Examples == | ||
The following example solves [https://leetcode.com/problems/add-two-numbers/ a LeetCode problem] which asks to add two numbers given as reversed digit lists: | |||
<source lang=apl> | |||
2 4 3 +_U_(10⊥⌽) 5 6 4 | |||
7 0 8 | |||
</source> | |||
First, each argument is reversed, then decoded from base 10. The addition is performed. Finally, the result is encoded to base 10 and reversed. | |||
== Close composition == | == Close composition == | ||
In [[SHARP APL]] and [[J]], Under is implemented as a [[close composition]], meaning that (using SHARP syntax) <source lang=apl inline>f¨g</source> has the overall [[function rank]] of <source lang=apl inline>g</source>. This allows < | In [[SHARP APL]] and [[J]], Under is implemented as a [[close composition]], meaning that (using SHARP syntax) <source lang=apl inline>f¨g</source> has the overall [[function rank]] of <source lang=apl inline>g</source>. This allows <source lang=apl inline>¨></source> to serve the purpose of [[Each]] from a [[Nested array model|nested]] APL. J uses <source lang=j inline>&.</source> for the close form and <source lang=j inline>&.:</source> for the rankless form. | ||
== History == | == History == | ||
The most widely known form of Under for much of APL's history was [[SHARP APL]]'s Dual operator, written < | The most widely known form of Under for much of APL's history was [[SHARP APL]]'s Dual operator, written <source lang=apl inline>¨</source> and defined as a [[close composition]]. It was presented by [[Ken Iverson]] and [[Bob Bernecky]] with the name "with" in 1980,<ref>[[Bob Bernecky]] and [[Ken Iverson]]. [https://www.jsoftware.com/papers/opea.htm Operators and Enclosed Arrays] at [[IPSA '80]]</ref> and implemented for only a small number of right operands in 1981.<ref>[https://www.jsoftware.com/papers/satn41.htm "Composition and Enclosure"]. SATN-41, 1981-06-20.</ref> The name "Dual" was used in [[Rationalized APL]] in 1983, and the full SHARP implementation using [[function rank]] was completed just after.<ref>[https://www.jsoftware.com/papers/satn45.htm "Language Extensions of May 1983"]. SATN-45, 1983-05-02.</ref> Iverson changed the name to Under for his 1987 [[A Dictionary of APL]], and [[J]] uses this name as well. It includes both a close form <source lang=j inline>&.</source> like SHARP and a non-close form <source lang=j inline>&.:</source>. | ||
However, Iverson had defined the Dual operator with glyph <source lang=apl inline>⍢</source> in his 1978 paper "Operators and Functions",<ref>[[Ken Iverson]]. [https://www.jsoftware.com/papers/opfns.htm ''Operators and Functions''], §8 Composition and Duality. IBM Research Report #RC7091. 1978-04-26.</ref> using a non-close form because [[function rank]] had not yet been invented. [[NARS]] featured this operator in 1981, preceding SHARP's limited implementation. [[Roger Hui]] proposed Under with the same definition as a potential addition to [[Dyalog APL]] at [[Dyalog '15]], and it was added to both [[Extended Dyalog APL]] and [[dzaima/APL]] in 2018. | However, Iverson had defined the Dual operator with glyph <source lang=apl inline>⍢</source> in his 1978 paper "Operators and Functions",<ref>[[Ken Iverson]]. [https://www.jsoftware.com/papers/opfns.htm ''Operators and Functions''], §8 Composition and Duality. IBM Research Report #RC7091. 1978-04-26.</ref> using a non-close form because [[function rank]] had not yet been invented. [[NARS]] featured this operator in 1981, preceding SHARP's limited implementation. [[Roger Hui]] proposed Under with the same definition as a potential addition to [[Dyalog APL]] at [[Dyalog '15]], and it was added to both [[Extended Dyalog APL]] and [[dzaima/APL]] in 2018. |