1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
(* The first part gives an internal error. *)
local
fun f {data, ...} = ()
fun g {base = {rows, cols, ...}, row:'a} = ()
fun h (reg as {base, row:int, ...}) =
let
val _ = f base (* Eventually, fixes base as {rows, cols, data} *)
val _ = g reg (* Fixes reg as {base, row} *)
in
()
end
val tt : { rows: int, cols: int, data: string } -> unit = f
in
end;
(* This part reports an Empty exception. *)
structure Vector2 :> sig
type 'a vector
val sub: 'a vector * int * int -> 'a
end =
struct
(* open IterateX*)
fun badArg _ = raise Fail "bad"
fun repeat f cnt init = let
fun iter (n,v) = if n = cnt then v else iter(n+1,f(n,v))
in
if cnt < 0
then badArg ("repeat","count < 0")
else iter (0,init)
end
type 'a vector =
{ rows: int
, cols: int
, data: 'a Vector.vector
}
datatype traversal = RowMajor | ColMajor
fun tabulate tr (r, c, f) = raise Size
fun sub (v as {cols=c, data=d,...}, i, j) = raise Size (*d // (i * c + j)*)
fun dimensions ({rows=r, cols=c,...}) = (r, c)
fun getRegion {base, row, col, nrows, ncols} =
let
val (lRows, lCols) = dimensions base
in
raise Subscript
end
fun mapi tr f (reg as {base, row, col, ...}) =
let val (nrows, ncols) = getRegion reg
fun select (i, j) =
let val (i', j') = (i + row, j + col)
in (i', j', sub (base, i', j')) end
in tabulate tr (nrows, ncols, f o select) end
fun foldi tr f x (reg as {base, row, col, ...}) =
let val (nrows, ncols) = getRegion reg
fun foldval (i, z) =
let val (j, k) =
case tr
of RowMajor => (row + i div ncols, col + i mod ncols)
| ColMajor => (row + i mod nrows, col + i div nrows)
in f (j, k, sub (base, j, k), z) end
in repeat foldval (nrows * ncols) x end
end;
|