Trains: Difference between revisions

From NARS2000
Jump to navigationJump to search
No edit summary
No edit summary
Line 52: Line 52:
<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg 1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;(+/ ÷ ) 1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;(+/ ÷ >) 1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;(+/1 2 3 4) ÷ ⍴1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;(+/1 2 3 4) ÷ >1 2 3 4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;10 ÷ ,4</apll><br />
<apll>←→&nbsp;&nbsp;&nbsp;&nbsp;10 ÷ 4</apll><br />
<apll>2.5</apll>
<apll>2.5</apll>



Revision as of 16:59, 29 August 2010

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