照相机中的打印类型

问题描述 投票:0回答:1

我在OCaml中有一些非常简单的逻辑:

let load filename =
  let file = get_file filename in
  let len = String.length file in
  Printf.printf "%a\n" file
  ()

([get_file是我编写的函数。)如您从此代码段中所见,我想打印file的内容只是为了了解返回的内容。我使用%a是因为OCaml教程之一说您应该为这种事情做。当我说“这种事情”时,我指的是一个频道,因此我将展示我的get_file函数是什么样的:

let get_file filename =
  let channel = open_in_bin filename in
  let length = in_channel_length channel in
  let file = really_input_string channel length in
  close_in channel;
  file

好的,因此在load方法中引用我的代码,会出现以下错误:

6 |   Printf.printf "%a\n" file
                           ^^^^
Error: This expression has type string but an expression was expected of type
         out_channel -> 'a -> unit

所以我认为“好吧,这是一个类型字符串,因为这就是消息所要告诉我的,所以我应该在我的printf文件中这样做。”所以我将printf更改为:

Printf.printf "%s\n" file

现在错误是:

6 |   Printf.printf "%s\n" file
                    ^^^^^^
Error: This expression has type
         ('a -> 'b, out_channel, unit, unit, unit, 'a -> 'b)
         CamlinternalFormatBasics.fmt
       but an expression was expected of type
         ('a -> 'b, out_channel, unit, unit, unit, unit)
         CamlinternalFormatBasics.fmt
       Type 'a -> 'b is not compatible with type unit 

考虑到我最初使用%a时开始出现的错误消息,我不知道您应该如何从那钝的错误消息中做出一些事情。

因此,我认为file可能是错误的尝试,因为这是通道问题,也许我错过了一些东西。因此,我尝试打印出len变量,该变量应该只是一个正整数。我将printf更改为此:

Printf.printf "%d\n" len

并且我收到另一个对我来说无用的错误消息:

6 |   Printf.printf "%d\n" len
                    ^^^^^^
Error: This expression has type
         ('a -> 'b, out_channel, unit, unit, unit, 'a -> 'b)
         CamlinternalFormatBasics.fmt
       but an expression was expected of type
         ('a -> 'b, out_channel, unit, unit, unit, unit)
         CamlinternalFormatBasics.fmt
       Type 'a -> 'b is not compatible with type unit 

我尝试将len的printf切换到%a只是为了查看报告的内容,而我得到了这个:

6 |   Printf.printf "%a\n" len
                           ^^^
Error: This expression has type int but an expression was expected of type
         out_channel -> 'a -> unit

是的,它的类型为int。这是我最初尝试打印的内容!因此,这是第一件事。一个错误消息告诉我变量是特定类型。然后,我尝试打印该特定类型,但得到的错误消息更长,但对我而言却没有那么多帮助了。

我找不到一个像样的OCaml教程,该教程仅带您通过使用诊断打印语句确定该语言在做什么的简单示例,因此在此处发布以查找我在做什么错。

我在OCaml中有一些非常简单的逻辑:let load filename = let file = get_file filename let len = Printf.printf“%a \ n” file()中的String.length文件()(get_file是我编写的一个函数。 )...

ocaml
1个回答
1
投票

错误消息的问题是Printf函数系列非常灵活,当发送给该函数的参数数量超出预期时,它转换为非常复杂的错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.