Under: Difference between revisions

Jump to navigation Jump to search
390 bytes added ,  23:10, 26 April 2022
no edit summary
(→‎Close composition: Move ¨> description from history section)
No edit summary
Line 1: Line 1:
{{Built-in|Under|⍢}}, or '''Dual''' (<code>¨</code>), 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>
{{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):
        _U_ ← {⍺←{⍵ ⋄ ⍺⍺} ⋄ ⍵⍵⍣¯1⊢(⍵⍵ ⍺)⍺⍺(⍵⍵ ⍵)}
<source lang=apl>      _U_ ← {⍺←{⍵ ⋄ ⍺⍺} ⋄ ⍵⍵⍣¯1⊢(⍵⍵ ⍺)⍺⍺(⍵⍵ ⍵)}</source>


== Examples ==
== Examples ==
      ⍝ https://leetcode.com/problems/add-two-numbers/
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:
      2 4 3 +_U_(10⊥⌽) 5 6 4
<source lang=apl>
7 0 8


      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 <code>¨></code> to serve the purpose of [[Each]] from a [[Nested array model|nested]] APL. J uses <code>&.</code> for the close form and <code>&.:</code> for the rankless form.
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 <code>¨</code> 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>.
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.

Navigation menu