ocamlex重新填充处理程序示例

ocamlex重新填充处理程序示例,ocaml,ocamllex,Ocaml,Ocamllex,在中,我未能编译以下示例: { type token = EOL | INT of int | PLUS module Make (M : sig type 'a t val return: 'a -> 'a t val bind: 'a t -> ('a -> 'b t) -> 'b t val fail : string -> 'a t

在中,我未能编译以下示例:

{

type token = EOL | INT of int | PLUS

module Make (M : sig
               type 'a t
               val return: 'a -> 'a t
               val bind: 'a t -> ('a -> 'b t) -> 'b t
               val fail : string -> 'a t

               (* Set up lexbuf *)
               val on_refill : Lexing.lexbuf -> unit t
             end)
= struct

let refill_handler k lexbuf arg =
    M.bind (M.on_refill lexbuf) (fun () -> k lexbuf arg)

}

refill {refill_handler}

rule token = parse
| [' ' '\t']
    { token lexbuf }
| '\n'
    { M.return EOL }
| ['0'-'9']+ as i
    { M.return (INT (int_of_string i)) }
| '+'
    { M.return PLUS }
| _
    { M.fail "unexpected character" }
{
end
}
我也不明白模块Make是如何工作的,它来自哪里。 注意:我目前正在使用4.02.1 ocaml编译器。

此代码定义模块Make,它是一个函子。也就是说,它接受一个模块作为参数并返回一个模块

它接受的模块参数是一个任意的monad,它本质上是一种表示在执行某项操作之后再执行其他操作时会发生什么的方式

您可以在此处找到单子的描述:

通过将refill函数更改为以下内容,我获得了要编译的代码:

let refill_handler k lexbuf =
    M.bind (M.on_refill lexbuf) (fun () -> k lexbuf)
原始定义似乎与重新填充处理程序的类型不匹配。(但我可能遗漏了一些东西;这种代码需要花很多时间才能习惯。)