Type
∊ ⊤ ⍷
|
Type (∊
, ⊤
, ⍷
) is a monadic scalar function which in the nested array model gives information about the type and structure of its argument array's elements. In normal cases, the result is identical to the argument, with all numbers replaced by zeros and all characters replaced by spaces, and the substitution is done recursively.
Support
Few dialects have Type as a primitive function. APL2 IUP had it,[1] and thus Dyalog APL originally supported it too. However, by the time IBM released APL2, ∊
(as in prototypical element) was repurposed for Enlist. Thus, Dyalog left the Type meaning in place only when migration level is 0, while setting it to 1 or higher follows IBM's replacement meaning. NARS2000 uses monadic ⊤
(resembling the Latin letter T for Type), which it inherited from NARS. Extended Dyalog APL uses monadic ⍷
with the underscore indicating functionality of the corresponding non-underscored glyph from a non-default migration level.[2]
However, in all dialects that support nested arrays, the type can be determined by enclosing/boxing the array in an empty array, and then coercing out a fill value. Since the array prototype is used as fill element, the resulting array will be the type of the original array:
↑ 0 ⍴ ⊂ 1 2 'ab' ┌─┬─┬──┐ │0│0│ │ └─┴─┴──┘
⊃ 0 ⍴ ⊂ 1 2 'ab' ┌─┬─┬──┐ │0│0│ │ └─┴─┴──┘
Additional types
Dyalog APL has additional data types, besides for the traditional numeric, character, and nested ones. Nulls and Object Representations are their own type, while instances of objects with niladic constructor (or no constructors) cause the creation of new instances of the same class. Other objects, namely namespaces and classes with constructors but no niladic constructor, cause a NONCE ERROR.
Examples
Type can be used to construct universal utilities that adapt to the type of data given as argument. For example:
Null ← ≡∘∊⍨ ⍝ Indicate empty or all blank and/or zero Nil ← ∊∘∊⍨ ⍝ Indicates null items Clean ← ~∘∊⍨ ⍝ Without null items Split ← (⊢⊆⍨∊≢¨⊢) ⍝ Split on null items data ← 'Hello' ' ' 'World' ⎕NULL (2 7 1 8) (3 1 4 1 5) (0 0 0) (0 0 7) Null 2⊃data 1 Null 3⊃data 0 Nil data 0 1 0 1 0 0 1 0 Clean data ┌─────┬─────┬───────┬─────────┬─────┐ │Hello│World│2 7 1 8│3 1 4 1 5│0 0 7│ └─────┴─────┴───────┴─────────┴─────┘ Split data ┌───────┬───────┬───────────────────┬───────┐ │┌─────┐│┌─────┐│┌───────┬─────────┐│┌─────┐│ ││Hello│││World│││2 7 1 8│3 1 4 1 5│││0 0 7││ │└─────┘│└─────┘│└───────┴─────────┘│└─────┘│ └───────┴───────┴───────────────────┴───────┘