我在下面的代码使用Bitstring module:这是我需要一个仿函数的情况吗?
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) ;;
需要注意的是,当你有BITSTRING { vv : 32 }
该节有望成为一个Int32值。我想推广这个函数来处理不同宽度的位串;即,我想创建一个build_data_n函数,其中bitstring将被构造为BITSTRING { vv : n }
。
但是,这里的问题是,如果n小于32,那么以上使用的succ函数将只是int类型的succ函数。如果是大于32这将是Int64.succ同样的问题,在上面的线let v' = Int32.of_int(v) in
- 当值小于32,将其配置为:let v' = v in
,而对于值大于32这将是:let v' = Int64.of_int(v) in
这是一个情况下,一个函子会派上用场来推广这个功能,如果是的话,我会如何设置它? (如果还有其他方法可以做到这一点,不需要函子,那也很好)
那么你是说如果你使用一个字段长度变量(n),那么vv总是会被强制为一个int64? – aneccodeal
啊,是的,我明白你在说什么了:#let get_bitstring v n = BITSTRING {v:n} ;; val get_bitstring:int64 - > int - > Bitstring.bitstring = –
aneccodeal