我有一个带有标准输入的函数save
,它可以单独使用,如下所示:
./try < input.txt (* save function is in try file *)
input.txt中
2
3
10 29 23
22 14 9
现在我将该函数放入另一个名为path.ml
的文件中,该文件是我的解释器的一部分。现在我在定义Save函数的类型时遇到了问题,这是因为save函数的类型为in_channel,但是当我写的时候
type term = Save of in_channel
ocamlc抱怨command
函数中的参数。
我该如何解决此错误?这就是我在stackoverflow上发布的最后一个问题的原因,我问了表达接受任何类型的变量的方法。我理解答案,但实际上它对于使代码运行没有多大帮助。
这是我的代码:
(* Data types *)
open Printf
type term = Print_line_in_file of int*string
| Print of string
| Save of in_channel (* error here *)
;;
let input_line_opt ic =
try Some (input_line ic)
with End_of_file -> None
let nth_line n filename =
let ic = open_in filename in
let rec aux i =
match input_line_opt ic with
| Some line ->
if i = n then begin
close_in ic;
(line)
end else aux (succ i)
| None ->
close_in ic;
failwith "end of file reached"
in
aux 1
(* get all lines *)
let k = ref 1
let first = ref ""
let second = ref ""
let sequence = ref []
let append_item lst a = lst @ [a]
let save () =
try
while true do
let line = input_line stdin in
if k = ref 1
then
begin
first := line;
incr k;
end else
if k = ref 2
then
begin
second := line;
incr k;
end else
begin
sequence := append_item !sequence line;
incr k;
end
done;
None
with
End_of_file -> None;;
let rec command term = match term with
| Print (n) -> print_endline n
| Print_line_in_file (n, f) -> print_endline (nth_line n f)
| Save () -> save ()
;;
修改
代码错误:
保存in_channel:
Error: This pattern matches values of type unit
but a pattern was expected which matches values of type in_channel
节省单位:
Error: This expression has type 'a option
but an expression was expected of type unit
答案 0 :(得分:0)
此代码中存在许多错误,因此很难知道从哪里开始。
一个问题是:您的save
函数的类型为unit -> 'a option
。所以它与最终match
的其他分支的类型不同。该修复很简单:save
应该返回()
,而不是None
。在OCaml中,这些是完全不同的东西。
直接问题似乎是你的匹配中有Save ()
,但已宣布Save
为输入频道。您当前的代码没有任何方法可以将输入通道传递给save
函数,但如果确实如此,您可能需要在匹配中更像这样的内容:
| Save ch -> save ch
这样的错误(对我而言)表明你对OCaml的类型系统并不熟悉。如果你在编写更多代码之前通过了某种教程,它可能会给你省去很多麻烦。您可以在http://ocaml.org找到教程。