As I wrote about previously I am working on a typed array language with the case of elliptic Fourier series as an example.

The compiler now works so I present the correct version:

λxs.λys.
  { sum ← [(+)/1 0 x]
  ; tieSelf ← [({.x)⊳x]; Δ ← [(-)\~(tieSelf x)]
  ; dxs ⟜ Δ xs; dys ⟜ Δ ys
  ; dts ⟜ [√(x^2+y^2)]\`dxs dys
  ; pxs ← (+)Λ dxs; pys ← (+)Λ dys; pts ⟜ (+)Λ dts
  ; dtss ⟜ (-)\~((^2)'1 (0<|pts))
  ; T ⟜}. pts
  ; 𝜉 ← (-)\`pxs ((\*)\`((%)\`dxs dts) pts)
  ; 𝛿 ← (-)\`pys ((\*)\`((%)\`dys dts) pts)
  ; A ← ((sum ((\*)\`((%)\`dxs dts) dtss))%2 + (sum ((\*)\`𝜉 dts)))%T
  ; C ← ((sum ((\*)\`((%)\`dys dts) dtss))%2 + (sum ((\*)\`𝛿 dts)))%T
  ; (A,C)
  }

This is shockingly close to what I wrote with only the typechecker working:

λxs.λys.
  { sum ⇐ [(+)/1 0 x]
  ; dxs ⟜ (-)\~xs; dys ⟜ (-)\~ys
  ; dts ⟜ [√(x^2+y^2)]\`dxs dys
  ; pxs ← (+)Λₒ 0 dxs; pys ← (+)Λₒ 0 dys; pts ⟜ (+)Λₒ 0 dts
  ; dtss ⟜ 0<|(-)\~((^2)'1 pts)
  ; T ⟜}.pts
  ; 𝜉 ← (-)\`pxs ((\*)\`((%)\`dxs dts) pts)
  ; 𝛿 ← (-)\`pys ((\*)\`((%)\`dys dts) pts)
  ; A ← ((sum ((\*)\`((%)\`dxs dts) dtss))%2 + (sum ((\*)\`𝜉 dts)))%T
  ; C ← ((sum ((\*)\`((%)\`dys dts) dtss))%2 + (sum ((\*)\`𝛿 dts)))%T
  ; (A,C)
  }

I believe this shows the promise of typing arrays: static typing offers faster feedback and even more incisive errors (being more abstract, they get to the heart of the matter).

A further advantage: Apple infers types and thus we do not need to write redundant documentation.