apldyalog

In Dyalog APL, can an Reduce N-Wise be a function or is it just an expression?


Say I want to name a function (assign to a variable) that does n-wise (2 in this example) reduction. Using tryapl.org it looks like I can't:

      v←⍳5
      2,/v
┌───┬───┬───┬───┐
│1 2│2 3│3 4│4 5│
└───┴───┴───┴───┘
      2,/
SYNTAX ERROR: Missing right argument
      2,/
       ∧

When I evaluate 2,/ I expect to get a little ASCII train tree something like this:

      -,/
┌┴┐
- /
┌─┘
,  

It seems like 2,/ works as an expression but not as a nameable function -- is that right?


Solution

  • Yes, but it has to form one of two patterns:

    1. A 3-train (fork) Agh
    2. A function with a bound argument A∘g

    A 3-train (fork) Agh

    This is an array A, a function g, and a function h, where h is applied monadically to the overall argument, and g is applied dyadically to the result of g, with A as g's left argument. Since ,/ is dyadic with the 2 as left argument, we have an extra function h pre-processing the argument. We don't need any pre-processing, so we use an identity function:

          v←⍳5
          f←2,/⊢
          f
    ┌─┼──┐
    2 ,/ ⊢
          f v
    ┌───┬───┬───┬───┐
    │1 2│2 3│3 4│4 5│
    └───┴───┴───┴───┘
    

    More about Forks on APL Wiki.

    A function with a bound argument A∘g

    Here, we use the Bind operator to curry a constant argument to a dyadic function. Our constant is 2 and the function g is ,/ but since operators like / have long left scope 2∘,/ would be parsed as (2∘,)/ which isn't what we want, so we have to parenthesise ,/:

          v←⍳5
          f←2∘(,/)
          f
     ∘
    ┌┴┐
    2 ,/
          f v
    ┌───┬───┬───┬───┐
    │1 2│2 3│3 4│4 5│
    └───┴───┴───┴───┘
    

    More about Bind on APL Wiki.