Dex: Mandelbrot set
The following is a port of mandelbrot.dx.
The escape time algorithm needs complex numbers, so we import the definition from the complex number example.
module complex = import "complex-numbers"
module c64 = complex.c64
type c64 = c64.complex
def update (c: c64) (z: c64) = c64.(c + z * z)
def tol : f64 = 2.0
def inBounds (z: c64) = c64.mag z < tolIn Dex, type trickery (the Fin 1000 type) is used to implicitly
fold across an imaginary 1000-element array. In Futhark, we use an
old-fashioned for-loop.
def escapeTime (c: c64) =
  (loop (n, z) = (0, c64.mk 0 0) for _i < 1000 do
   let z' = update c z
   in (n + f64.bool (inBounds z'), z')).0A more idiomatic Futhark implementation would use a while-loop
(as here).
We finish up with a simple main function that produces a
two-dimensional array of floats.
def main h w =
  tabulate_2d h w
              (\j i ->
                 let x = -2.0 + f64.i64 i * (3/f64.i64 w)
                 let y =   -1 + f64.i64 j * (2/f64.i64 h)
                 in 1-escapeTime (c64.mk x y) / 1000)> :img main 200i64 300i64
