Listening to Freya Holmér last night I started to get glimmers of an idea I had long ago about how to represent vector spaces in computational processes using this recursive abstract type : abstype 'a point = POINT of {getx : 'a vector, diff : 'a point -> 'a point, move : 'a point -> 'a point, scale : 'a -> 'a point, proj : 'a point -> 'a} with fun new i (op +) (op -) (op * ) dot = let fun self x = POINT {getx = x, move = fn (POINT pr) => (self (x + (#getx pr))), diff = fn (POINT pr) => self (x - (#getx pr)), scale = fn i => (self (x * i)), proj = fn (POINT pr) => ...