# Pervasion

Pervasion during function application is the concept of a function being defined in terms of the simple scalars in nested arrays. It is a feature of nested array languages, while flat array languages usually do have function pervade into boxes. Pervasion can be seen as and modelled by recursing into all nested elements until the function can be applied to all simple scalars.

Scalar functions exhibit pervasion by default, whereas mixed functions and user defined functions do not. The pervading behaviour can be obtained for any function by using enough consecutive Each operators `¨` to reach the simple scalars at the deepest point of nesting in any argument.

In dialects with the Depth operator (`⍥`), a function can be made pervasive with `⍥0`:

```      NonScalarFn←{⍵:'t' ⋄ 'f'}
(NonScalarFn⍥0) (0 1) 1 (⊂1 0)
┌──┬─┬────┐
│ft│t│┌──┐│
│  │ ││tf││
│  │ │└──┘│
└──┴─┴────┘
```
Works in: Extended Dyalog APL, dzaima/APL since 2020-03-01

In dzaima/APL the dyadic form of Depth is not yet implemented, so this definition will only work for monadic function application

In dialects that support dfns, this operator can be defined[1] as:

```perv←{⍺←⊢               ⍝ Scalar pervasion
1=≡⍺ ⍵ ⍵:⍺ ⍺⍺ ⍵     ⍝ (⍺ and) ⍵ depth 0: operand fn application
⍺ ∇¨⍵      ⍝ (⍺ or) ⍵ deeper: recursive traversal.
}
```
Works in: Dyalog APL

In all dialects that support user defined tradops, the operator for monadic function application can be defined as:

``` R←(f perv)Y
→(0=≡Y)/APPLY
R←f perv¨Y
→0
APPLY:R←f Y
```

## References

1. John Scholes, perv (Scalar pervasion). dfns workspace, 2019-02-17.
APL features