GHC includes span information in compiler errors, but not in a format suitable for vim:

src/Jacinda/Backend/TreeWalk.hs:319:58: error:
    • The constructor ‘TyArr’ should have 3 arguments, but has been given 4
    • In the pattern:
        TyArr \_ \_ (TyArr \_ (TyApp \_ (TyB \_ TyStream) \_)) \_
      In the pattern:
        TyArr \_ \_ (TyArr \_ \_ (TyArr \_ (TyApp \_ (TyB \_ TyStream) \_)) \_)
      In the pattern:
        TBuiltin (TyArr \_ \_
                        (TyArr \_ \_ (TyArr \_ (TyApp \_ (TyB \_ TyStream) \_)) \_))
                 Fold
    |
319 | eWith re i (EApp \_ (EApp \_ (EApp \_ (TBuiltin (TyArr \_ \_ (TyArr \_ \_ (TyArr \_ (TyApp \_ (TyB \_ TyStream) \_)) \_)) Fold) op) seed) stream) = foldWithCtx re i op seed stream
    |                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We can handle this with awk (in fact, vim ships with mve.awk, a script to do something similar for C compilers), viz.

BEGIN { FS="\|" }

/ *\^+/ {
    p=match($2, "\\^+")
    colstart=RSTART-1
    col=colstart+RLENGTH
    printf("%d-%d\n", colstart, col)
}

On the above example, this gives

58-108

Since this is a nontrivial (useful) demonstration of awk, I figured I would try something similar with my own jacinda:

:set fs:=/\|/;

fn printSpan(str) :=
  let
    val p := match str /\^+/
    val str := option '(none)' (sprintf '%i-%i') p
  in str end;

printSpan¨{% / *\^+/}{`2}

This avoids the strangeness of setting RSTART and RLENGTH (global variables) after a function call (match), instead returning multiple values with a tuple.