嵌套函数

时间:2017-03-25 20:04:17

标签: pattern-matching ocaml

我一直在盯着这段代码一段时间,无法弄清楚为什么我会收到语法错误:

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是一个函数,如果transitionNone匹配,则返回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转换,因此不包括在内。< / em>的

该代码使用Ocaml的本机模块List中的fold_leftsort_uniq函数。

1 个答案:

答案 0 :(得分:2)

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