나는 다음과 같은 코드에서 Bitstring module을 사용하고 있습니다 : 당신이 BITSTRING { vv : 32 }
있을 때 절가 Int32 값 것으로 예상된다펑터가 필요한 경우입니까?
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 : n }
으로 생성 될 build_data_n 함수를 만들고 싶습니다.
그러나 n은 32보다 작 으면 위에 사용 된 succ 함수는 int 유형의 succ 일뿐입니다. 이 32 이상이라면 그것은 라인 let v' = Int32.of_int(v) in
에 위 같은 문제 Int64.succ 것 - 값 미만 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