I’m using the Bitstring module in the following code:
let build_data_32 v wid =
let num = wid / 32 in
let v' = Int32.of_int(v) in
let rec aux lst vv w = match w with
0 -> lst
| _ -> (BITSTRING { vv : 32 } ) :: ( aux lst (Int32.succ vv) (w-1)) in
Bitstring.concat ( aux [] v' num ) ;;
Note that when you have BITSTRING { vv : 32 }
that vv is expected to be an Int32 value. I’d like to generalize this function to work with different widths of bitstrings; ie, I’d like to create a build_data_n function where the bitstring would be constructied with BITSTRING { vv : n } .
However, the problem here is that if n is less than 32 then the succ function used above would just be the succ for type int. If it’s greater than 32 it would be Int64.succ Same issue above in the line let v' = Int32.of_int(v) in – for values less than 32 it would simply be: let v' = v in , whereas for values greater than 32 it would be: let v' = Int64.of_int(v) in
Is this a case where a functor would come in handy to generalize this function and if so, how would I set that up? (and if there’s some other way to do this that doesn’t require functors, that would be nice to know as well)
With
BITSTRING { vv : n }, i.e. using runtime-specified field length, the type ofvvcannot depend onnas it is not the compile-time constant anymore, sovvis forced toint64.