【问题标题】:Ocaml syntax error in nested functions嵌套函数中的 Ocaml 语法错误
【发布时间】:2017-03-25 20:04:17
【问题描述】:

我已经盯着这段代码看了一段时间,不知道为什么会出现语法错误:

let rec e_closure (m:nfa_t) (l:int list) = match m with
    | (_, _, (ts:transition list)) -> 
        List.sort_uniq (List.fold_left 
                            (fun (lst:int list) (state:int) -> 
                                List.fold_left 
                                    (fun (lst2:int list) (t:transition) -> 
                                        match t with 
                                        | ((start:int), (letter:char option), (end:int)) -> (if ((start = a) && (isEpilson letter)) then end::lst2 else lst2) 
                                        | _ -> raise (NFAError "e_closure match failure (nested)")) lst ts) l l)
    | _ -> raise (NFAError "e_closure match failure")
;;

无需过多详细介绍这个复杂的代码,它的功能是返回给定 NFA(非确定性有限自动机)状态的 epsilon 闭包列表。它的例外类型在代码中进行了注释。

我收到的错误消息在 第 8 行,说明 Error: Syntax error: operator expected.

我怀疑知道代码的功能是无关紧要的,但在这里:

isEpsilon 是一个函数,如果 transition 匹配 None,则返回 true。

NFAError 是用户定义的错误。

用户定义的类型有:

type char option = None | Some of char
type transition = int * char option * int
type nfa_t = int * int list * transition list

按上述顺序列出的每种类型的示例:

None
(1, None, 2)
(1, [2;3], [(1, None, 2); (1, Some 'a', 3)])

e_closure函数使用示例:

e_closure (1, [2,3], [(1, None, 2); (1, Some 'a', 3)]) [1] = [1;2]

也就是说,该函数查看列表 [(1, None, 2); (1, Some 'a', 3)],返回一个 int list 包含其第二个参数中的每个元素以及每个 epsilon 转换该参数的所有元素。在这种情况下,由于第二个参数是[1],它会返回[1;2],转换(1, Some 'a', 3)不是epsilon转换,所以不包括在内。

代码使用了在 Ocaml 的原生模块 List 中找到的函数 fold_leftsort_uniq

【问题讨论】:

  • 注意语法高亮中end的颜色。

标签: pattern-matching ocaml


【解决方案1】:

您使用 end 作为标识符,但它是 OCaml 中的关键字。

【讨论】:

  • 哇,我一点都不震惊
猜你喜欢
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多