OCaml错误:构造函数中的表达式类型错误

时间:2014-03-09 17:35:12

标签: ocaml

我有一个带有标准输入的函数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

1 个答案:

答案 0 :(得分:0)

此代码中存在许多错误,因此很难知道从哪里开始。

一个问题是:您的save函数的类型为unit -> 'a option。所以它与最终match的其他分支的类型不同。该修复很简单:save应该返回(),而不是None。在OCaml中,这些是完全不同的东西。

直接问题似乎是你的匹配中有Save (),但已宣布Save为输入频道。您当前的代码没有任何方法可以将输入通道传递给save函数,但如果确实如此,您可能需要在匹配中更像这样的内容:

| Save ch -> save ch

这样的错误(对我而言)表明你对OCaml的类型系统并不熟悉。如果你在编写更多代码之前通过了某种教程,它可能会给你省去很多麻烦。您可以在http://ocaml.org找到教程。