繁体   English   中英

如何定义导出单个功能的模块?

[英]How to define module that exports a single function?

我想学习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

...以及其他几个地方,却没有发现与问题相关的东西(或可行的东西)。

即使有很多关于OCaml文档的页面,我也找不到能告诉我如何编写Mymod模块的内容。

我尝试将以下任何内容放入mymod.mli文件中:

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

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

我在文档中都找不到用于定义仅返回其(字符串)输入的函数的语法。

我将不胜感激。

要详细说明@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

OCaml手册的第2.5节对此进行了描述。

mymod.ml中而不是mymod.mli编写代码。 *.ml用于代码, *.mli用于接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM