首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查OCaml中是否存在函数

检查OCaml中是否存在函数
EN

Stack Overflow用户
提问于 2019-09-26 22:22:54
回答 1查看 261关注 0票数 0

我正在尝试写一个脚本来评分用OCaml写的家庭作业。我有两个文件,homework.mltestRunner.mlhomework.ml的功能由学生按照家庭作业的要求用名字实现。就像。假设学生被要求实现一个函数,该函数计算函数名为square的数字的平方。如果学生不知道答案,他可以跳过写函数。

我的testRunner.ml可以从homework.ml运行函数,但是如果学生运行而不是,则会失败,在本例中,该函数的实现是对Unbound value square的抱怨。

在调用函数之前,OCaml中有检查函数是否存在的方法吗?我试图将函数调用包装在一个try...with中,但结果仍然不起作用。

代码语言:javascript
运行
复制
print_string "my_function [] 5 = "; 
try 
  print_endline (string_of_int (my_function [] 5)); (* This fails because the student did not write the my_function function *)
with _ -> print_string "Error";;

很抱歉,如果已经有人问过这个问题,我找不到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-26 22:52:58

OCaml中的函数是静态的,这意味着函数名称必须在编译时引用特定的实现。

因此,最简单的解决方案是为学生提供一个homework.ml文件,该文件为每个需要实现的函数提供默认实现。这也可以包括将任务描述为与每个职能相关的评论。例如:

代码语言:javascript
运行
复制
(* (Optional) Implement a function [square] which squares the integer [x] *)
let square x =
  failwith "not implemented"

但是,您也可以在testRunner.ml中提供默认实现,并在它们之后包含homework.ml的内容。如果没有在那里定义square,那么它将返回到先前定义的默认实现,如果定义了它,则学生的实现将隐藏默认值。出于沙箱的目的,在子模块中这样做也是一个好主意:

代码语言:javascript
运行
复制
module H = struct
  let square _ =
    failwith "not implemented"

  include Homework (* This will essentially include the contents of homework.ml at this point *)
end

let () =
  print_string "square 5 = "; 

  try 
    print_endline (string_of_int (H.square 5))
  with
    _ -> print_string "Error"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58125463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档