我想学习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
),我找不到解释它们的文档。
我也无法在文档中找到定义只返回其(字符串)输入的函数的语法。
我很感激一些帮助。
答案 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
用于接口。