signature vecfun= sig type vectfun val makevfun :(real->real->real ->real)*(real->real->real ->real)*(real->real->real ->real) ->vectfun val add :vectfun*vectfun ->vectfun val diff :vectfun*vectfun ->vectfun val dot :vectfun*vectfun ->(real->real->real ->real) val cross :vectfun*vectfun ->vectfun val curl :vectfun ->vectfun val dvg :vectfun ->real->real->real -> real end structure Vfun :vecfun= struct datatype vectfun= VEC of (real->real->real ->real)*(real->real->real ->real)*(real->real->real ->real) fun makevfun(a,b,c)=VEC(a,b,c) fun fsum a b (x:real) (y:real) (z:real) =((a x y z ) +(b x y z)) :real fun fdiff a b (x:real) (y:real) (z:real)=((a x y z ) -(b x y z)) :real fun fmult a b (x:real) (y:real) (z:real) =((a x y z )*(b x y z)) :real fun add(VEC(ax,ay,az),VEC(bx,by,bz))=VEC((fsum ax bx),(fsum ay by),(fsum az bz)) fun diff(VEC(ax,ay,az),VEC(bx,by,bz))=VEC((fdiff ax bx),(fdiff ay by),(fdiff az bz)) fun dot(VEC(ax,ay,az),VEC(bx,by,bz))= fsum (fsum (fmult ax bx) (fmult ay by)) (fmult az bz) fun cross(VEC(ax,ay,az),VEC(bx,by,bz))=VEC((fdiff (fmult ay bz) (fmult by az)), (fdiff (fmult bx az) (fmult ax bz)), (fdiff (fmult ax by) (fmult bx ay))) fun diffr f x = ((f (x +0.0001)) - (f x))/0.0001 fun partx a y1 z1 x1 =let fun a1 y z x = a x y z in diffr ( a1 y1 z1) x1 end fun party a z1 x1 y1=let fun a1 z x y = a x y z in diffr (a1 x1 z1) y1 end fun partz a x1 y1 z1 = diffr( a x1 y1 ) z1 fun curl (VEC(ax,ay,az))=VEC(fdiff (party az) (partz ay),fdiff (partz ax) (partx az),fdiff (partx ay) (partz ax)) fun dvg(VEC(ax,ay,az))=(fsum (partx ax) (fsum (party ay) (partz az))) end