OCaml树搜索函数第15行参数counter处语法错误排查求助
OCaml函数定义语法错误排查:大写开头函数名导致的问题
你的代码在let rec GetSubEvenGen tree counter list =行触发语法错误,核心原因是函数名使用了大写字母开头。
在OCaml的语法规则中,大写开头的标识符会被编译器认定为代数数据类型的构造器(比如你定义的Lf、Br),而非普通函数名。编译器遇到GetSubEvenGen时,会预期后续是构造器的参数定义格式,而非函数的参数列表,因此在counter位置抛出语法错误。
修正方案
将函数名改为小写开头(符合OCaml命名惯例,通常用下划线分隔小写单词),即可解决语法问题。同时注意原代码存在逻辑偏差:你需求是返回偶数元素的下标,但原代码将元素值加入了列表,这里一并修正:
type 'a tree = |Lf |Br of 'a * 'a tree * 'a tree;; exception Subscript let rec look = function | Lf, _ -> raise Subscript | Br (v, t1, t2), k -> if k = 1 then v else if k mod 2 = 0 then look (t1, k / 2) else look (t2, k / 2);; let rec get_sub_even_gen tree counter list = try let element = look (tree, counter) in if element mod 2 = 0 then get_sub_even_gen tree (counter + 1) (counter :: list) else get_sub_even_gen tree (counter + 1) list with Subscript -> List.rev list;; let get_subs_of_evens tree = get_sub_even_gen tree 1 [];;
验证说明
修正后代码可以正常编译:
- 小写开头的
get_sub_even_gen被编译器识别为普通递归函数 - 逻辑上会遍历树的所有索引(按你的
look函数定义的索引规则),收集偶数元素对应的索引,最终返回递增列表(通过List.rev反转收集的逆序列表)
内容的提问来源于stack exchange,提问作者user16275866
相关产品推荐
相关产品推荐

