如何定义导出单个函数的模块?

时间:2014-11-07 17:18:17

标签: testing module ocaml

我想学习OCaml很多年了,最近我决定最终去学习OCaml,但我第一次真正接触OCaml并不是吉祥......

我正在使用一套练习来学习它(这种方法对我来说非常适合其他语言)。每个练习都附带一个测试脚本。第一个测试脚本是:

(* test.ml *)

open Core.Std
open OUnit2
open Mymod

let ae exp got _test_ctxt = assert_equal ~printer:String.to_string exp got

let tests = ["hello" >:: ae "hello!" (echo "hello!");]

let () =
    run_test_tt_main ("tests" >::: tests)

我整个上午花了字面无法让它发挥作用。

我试图找出如何在所有这些地方做到这一点:

https://realworldocaml.org/v1/en/html/files-modules-and-programs.html

http://caml.inria.fr/pub/distrib/ocaml-4.01/ocaml-4.01-refman.html

https://ocaml.org/learn/tutorials/modules.html

......以及其他几个地方,发现 nothing 看起来甚至与问题相关(或有效)。

即使有OCaml文档的页面和页面,我找不到任何能告诉我如何编写Mymod模块的内容。

我已尝试在mymod.mli文件中添加以下任何内容:

let echo x = x ;;
let echo : string -> string = fun x -> x ;;
let echo x : string = x ;;

......以及其他几十种变种;他们都无法编译,更不用说通过测试了。编译器错误消息是不可穿透的(例如:illegal begin of interf),我找不到解释它们的文档。

我也无法在文档中找到定义只返回其(字符串)输入的函数的语法。

我很感激一些帮助。

2 个答案:

答案 0 :(得分:3)

要详细说明@camlspotter指出的内容,你应该有一个mymod.mli这样的文件:

val echo : string -> string

mymod.ml这样的文件:

let echo s = s

您可以像这样编译和运行:

$ ocamlopt -c mymod.mli
$ ocamlopt -c mymod.ml
$ echo 'Printf.printf "saw %s\n" (Mymod.echo "hello world")' > main.ml
$ ocamlopt -o main mymod.cmx main.ml
$ ./main
saw hello world

Section 2.5 of the OCaml manual中描述了这一点。

答案 1 :(得分:2)

将您的代码写在mymod.ml中,而不是mymod.mli*.ml用于代码,*.mli用于接口。