Functional programming 为什么口译员告诉我;“let rec'&引用;

Functional programming 为什么口译员告诉我;“let rec'&引用;,functional-programming,ocaml,Functional Programming,Ocaml,我编写了一个ocaml程序,通过parser combinator解析算术表达式 type 'a parser = char list -> ('a * (char list)) list let return (x: 'a): 'a parser = fun input -> [x, input] let fail: 'a parser = fun _ -> [] let ( >>= ) (p: 'a parser) (f : 'a -> 'b parser

我编写了一个ocaml程序,通过parser combinator解析算术表达式

type 'a parser = char list -> ('a * (char list)) list
let return (x: 'a): 'a parser = fun input -> [x, input]
let fail: 'a parser = fun _ -> []
let ( >>= ) (p: 'a parser) (f : 'a -> 'b parser): 'b parser =
    fun input -> List.map (fun (x, i) -> f x i) (p input) |> List.flatten

let ( ||| ) (p: 'a parser) (q: 'a parser) = 
    fun input -> (p input) @ (q input)

let token: (char parser) = function
    | x::xs -> [x, xs]
    | [] -> []

let char(c: char): (char parser) =
    token >>= fun x ->
    if x = c then return x else fail

let digit: (char parser) =
    token >>= fun x ->
    if x >= '0' && x <= '9' then return x else fail

let rec many(p: 'a parser): 'a list parser =
    (p >>= fun x ->
    many p >>= fun xs ->
    (return (x::xs))) 
    ||| (return [])

let number = 
    many digit >>= fun x -> 
    return (List.fold_left (fun l r -> l * 10 + (int_of_char r - int_of_char '0')) 0 x)

type expr = Add of (expr * expr)
            | Sub of (expr * expr)
            | Mul of (expr * expr)
            | Div of (expr * expr)
            | Neg of expr
但这段代码中有一个错误

    Error: This kind of expression is not allowed as right-hand side of `let rec'
此页()显示: 编译器只允许在let rec的右侧显示三种可能的构造:函数定义、构造函数或lazy关键字

我认为类型解析器是一个函数而不是一个值,为什么会发生这种情况?

“函数定义”意味着一个literan
fun x->
构造。函数语言考虑部分函数应用,如

factor >>= fun l -> ...
redex,而不是literal值,这意味着当它们出现在简单变量绑定的RHS上时,严格的语言必须立即计算它们,如

term = factor >>= fun l -> ...

因为,一般来说,急切地评估递归定义的RHS会产生一个无限循环,严格的语言通常会禁止构造或要求绑定显式标记为惰性。

右侧应该是“函数定义”,而不仅仅是函数。函数定义是一种句法结构,由
fun->
Function…
组成,包括
let f x…
的语法糖。手册的章节和中有更正确的措辞。

编译器是否告诉您错误行?字符37-178:…term>>=fun l->(char'+'| | | char'-')>=fun op->term>=fun r->如果op='+',则返回(Add(l,r))否则返回(Sub(l,r))
term = factor >>= fun l -> ...