Trains: Difference between revisions

From NARS2000
Jump to navigationJump to search
No edit summary
No edit summary
 
(4 intermediate revisions by one other user not shown)
Line 4: Line 4:
     <table border="0" cellpadding="5" cellspacing="0" summary="">
     <table border="0" cellpadding="5" cellspacing="0" summary="">
     <tr>
     <tr>
       <td><apll>Z←(f g) R</apll></td>
       <td><apll>Z←&nbsp;&nbsp;(f g) R</apll></td>
       <td></td>
       <td></td>
       <td></td>
       <td></td>
       <td>is called a '''Monadic Hook''' &mdash; <apll>Z ≡ R g h R</apll></td>
       <td>is called a '''Monadic Hook''' &mdash; <apll>Z ≡ R f g R</apll></td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 13: Line 13:
       <td></td>
       <td></td>
       <td></td>
       <td></td>
       <td>is called a '''Dyadic Hook''' &mdash; <apll>Z ≡ L g h R</apll></td>
       <td>is called a '''Dyadic Hook''' &mdash; <apll>Z ≡ L f g R</apll></td>
     </tr>
     </tr>
     <tr>
     <tr>
       <td><apll>Z←(f g h) R</apll></td>
       <td><apll>Z←&nbsp;&nbsp;(f g h) R</apll></td>
       <td></td>
       <td></td>
       <td></td>
       <td></td>
Line 28: Line 28:
     </tr>
     </tr>
     <tr>
     <tr>
       <td><apll>Z←(f g h ...) R</apll><br /><apll>Z←L (f g h ...) R</apll></td>
       <td><apll>Z←&nbsp;&nbsp;(f g h ...) R</apll><br /><apll>Z←L (f g h ...) R</apll></td>
       <td></td>
       <td></td>
       <td></td>
       <td></td>
Line 37: Line 37:
</tr>
</tr>
<tr>
<tr>
   <td><apll>L</apll> and <apll>R</apll> are arbitrary arrays, <apll>f</apll>, <apll>g</apll>, <apll>h</apll>, etc, are arbitrary functions of any type:  primitive, user-defined, system, and/or derived.</td>
   <td><apll>L</apll> and <apll>R</apll> are arbitrary arrays, <apll>f</apll>, <apll>g</apll>, <apll>h</apll>, etc, are arbitrary functions of any type:  primitive, user-defined, system, anonymous, and/or derived.</td>
</tr>
</tr>
</table>
</table>
<br />
<br />
<p>This clever idea from the designers of J is called [http://www.jsoftware.com/help/dictionary/dictf.htm Trains] where a parenthesized sequence of functions (which normally would signal a SYNTAX ERROR) can be interpreted as per the above descriptions.  Note that the spacing between functions is for visual purposes only &mdash; it has no effect on the interpretation.</p>
<p>This clever idea from the designers of J is called [http://www.jsoftware.com/help/dictionary/dictf.htm Trains] where a parenthesized sequence of functions (which normally would signal a SYNTAX ERROR) can be interpreted as per the above descriptions.  Very nicely, they fit into and extend the spectrum of function definition syntax from user-defined to dynamic to trains to operator expressions.  They are another and very interesting form of functional programming.</p>
 
<p>Note that the spacing between functions is for visual purposes only &mdash; it has no effect on the interpretation.</p>


<p>For example,</p>
<p>For example,</p>


<apll>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(,⍎)'2+3'</apll><br />
<apll>     (,⍎)'2+3'</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;'2+3',⍎'2+3'</apll><br />
<apll>←→   '2+3',⍎'2+3'</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;'2+3',5</apll><br />
<apll>←→   '2+3',5</apll><br />
<apll>2+3 5</apll><br />
<apll>2+3 5</apll><br />


<apll>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg{is}(+/ ÷ )</apll>  defines a function that computes the average of a numeric vector.<br />
<apll>     avg{is}(+÷ )</apll>  defines a function that computes the average of a numeric vector.<br />
<apll>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg 1 2 3 4</apll><br />
<apll>     avg 1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;(+/ ÷ ) 1 2 3 4</apll><br />
<apll>←→   (+÷ ) 1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;(+/1 2 3 4) ÷ ⍴1 2 3 4</apll><br />
<apll>←→   (+⌿1 2 3 4) ÷ ≢1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;10 ÷ ,4</apll><br />
<apll>←→   10 ÷ 4</apll><br />
<apll>2.5</apll>
<apll>2.5</apll>


<p>Longer Trains are defined as follows:</p>
<p>Longer Trains are defined as follows:</p>


<apll>(e f g h) ←→ (e (f g h))</apll><br />
<apll> (e f g h) ←→   (e (f g h))</apll><br />
<apll>(d e f g h) ←→ (d e (f g h))</apll><br />
<apll>(d e f g h) ←→ (d e (f g h))</apll><br />


and in general
and in general


Even length:  <apll>(a b c ...) ←→  (a (b c ...))</apll><br /> 
{|border="0"
Odd  length:  <apll>(a b c ...) ←→  (a b (c ...))</apll><br />
|Even length:  || <apll>(a b c ...) ←→  (a (b c ...))</apll>
|-
|Odd  length:  || <apll>(a b c ...) ←→  (a b (c ...))</apll>
|}


<p>For more applications of this concept, see the [http://www.jsoftware.com/help/learning/09.htm discussion] in the '''Learning J''' manual.</p>
<p>For more applications of this concept, see the [http://www.jsoftware.com/help/learning/09.htm discussion] in the '''Learning J''' manual.</p>


<p>There is also a series of [[Train_Tables|tables]] of common function expressions and their corresponding Train.</p>
<p>There is also a series of [[Train_Tables|tables]] of common function expressions and their corresponding Train.</p>

Latest revision as of 19:32, 15 April 2018

Z←  (f g) R is called a Monadic HookZ ≡ R f g R
Z←L (f g) R is called a Dyadic HookZ ≡ L f g R
Z←  (f g h) R is called a Monadic ForkZ ≡ (f R) g h R
Z←L (f g h) R is called a Dyadic ForkZ ≡ (L f R) g L h R
Z←  (f g h ...) R
Z←L (f g h ...) R
is also defined for longer Trains
L and R are arbitrary arrays, f, g, h, etc, are arbitrary functions of any type: primitive, user-defined, system, anonymous, and/or derived.


This clever idea from the designers of J is called Trains where a parenthesized sequence of functions (which normally would signal a SYNTAX ERROR) can be interpreted as per the above descriptions. Very nicely, they fit into and extend the spectrum of function definition syntax from user-defined to dynamic to trains to operator expressions. They are another and very interesting form of functional programming.

Note that the spacing between functions is for visual purposes only — it has no effect on the interpretation.

For example,

(,⍎)'2+3'
←→ '2+3',⍎'2+3'
←→ '2+3',5
2+3 5

avg←(+⌿ ÷ ≢) defines a function that computes the average of a numeric vector.
avg 1 2 3 4
←→ (+⌿ ÷ ≢) 1 2 3 4
←→ (+⌿1 2 3 4) ÷ ≢1 2 3 4
←→ 10 ÷ 4
2.5

Longer Trains are defined as follows:

(e f g h) ←→ (e (f g h))
(d e f g h) ←→ (d e (f g h))

and in general

Even length: (a b c ...) ←→ (a (b c ...))
Odd length: (a b c ...) ←→ (a b (c ...))

For more applications of this concept, see the discussion in the Learning J manual.

There is also a series of tables of common function expressions and their corresponding Train.