Trains: Difference between revisions
No edit summary |
No edit summary |
||
Line 7: | Line 7: | ||
<td></td> | <td></td> | ||
<td></td> | <td></td> | ||
<td>is called a '''Monadic Hook''' — <apll>Z ≡ R g | <td>is called a '''Monadic Hook''' — <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''' — <apll>Z ≡ L g | <td>is called a '''Dyadic Hook''' — <apll>Z ≡ L f g R</apll></td> | ||
</tr> | </tr> | ||
<tr> | <tr> |
Revision as of 18:17, 10 March 2010
|
||||||||||||||||||||
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.