I used the extraction from Coq to OCaml, where I have type Z, N, positive
I don't use to extract it in int of OCaml.
Then the type I have after the extraction is:
type positive =
| Coq_xI of positive
| Coq_xO of positive
| Coq_xH
type coq_N =
| N0
| Npos of positive
type coq_Z =
| Z0
| Zpos of positive
| Zneg of positive
I have a program in OCaml where some functions using the OCaml type string.
In my OCaml program, I need to write some functions convert the type: string -> coq_N, string -> coq_Z, string -> positive
I tried to write the functions in Coq and then used the extraction to get the OCaml type but Coq string is different from OCaml string.
For instance:
open Ascii
open BinNums
open Datatypes
type string =
| EmptyString
| String of ascii * string
let string_of_coqN (s: string): coq_N =
match s with
| EmptyString -> N0
| String (a, _) -> (coq_N_of_ascii a);;
where coq_N_of_ascii is the extraction from coq function N_of_ascii.
When I applied the function string_of_coqN, for instance:
let test (x: string) = string_of_N x;;
I got the complain that
Error: This expression has type string but an expression was expected of type
String0.string
Could you please help me to find a way to write the convert functions : string -> coq_N, string -> coq_Z and string -> positive?
For strings, the easiest thing to do is probably to import the standard library module
ExtrOcamlStringin your extraction file, which will cause Coq to extract them as achar listin OCaml. You can then convert betweenchar listand nativestrings with custom code. Have a look for instance at filelib/Camlcoq.vin the CompCert distribution, functionscamlstring_of_coqstringandcoqstring_of_camlstring.