如何在OCaml中打印包含我自己的元素类型的列表?

时间:2014-05-06 14:09:17

标签: list printing ocaml

以下是元素的类型:

type listIS=Vide | I of int*listIS |S of string*listIS ;;

let l=I(5,I(3,S("3",I(0,S("",Vide)))));;

我的变种:

let rec afficheIS l=match l with
  |Vide ->""
  |I (i,l) -> (string_of_int i)^(afficheIS l)
  |S (s,l) -> (s)^(afficheIS l);;

但我怎么能改变给我结果:

5 3 3 0
-:unit = ()

3 个答案:

答案 0 :(得分:3)

您的问题就在这里:let rec afficheIS l=function您的函数afficheIS期望参数l(从未使用过),并且递归地致电afficheIS您不能提供l参数。 实际上这个l对应什么都没有,所以你应该删除它。

答案 1 :(得分:2)

关于如何改进代码,我提出了一些建议。

首先是美,对于那些阅读代码(不是编译器)的人来说很重要。请考虑在词汇之间使用空格。阅读代码会更容易。

接下来,没有必要把它;;

然后我想建议更清洁地实现打印功能

open Printf

type listIS =
  | Vide
  | I of int * listIS
  | S of string * listIS


let rec fprintIS out l = match l with
  | Vide    -> fprintf out "\n"
  | I (i,l) -> fprintf out "%d %a" i fprintIS l
  | S (s,l) -> fprintf out "%s %a" s fprintIS l


let l=I(5,I(3,S("3",I(0,S("",Vide)))))

let printIS = fprintIS stdout
let () = printIS l

我希望您熟悉printf功能。如果没有,那么我可以尝试找出一些其他解决方案,让您更容易理解。

在这个解决方案中(我已经对代码进行了美化,你可能已经注意到了)我使用了“%a”格式说明符。它需要两个参数:第一个是打印任意类型值的函数,第二个是该类型的值。使用说明符,您可以构建组合您的打印机。

答案 2 :(得分:1)

解决:

 let rec afficheIS =function
      |Vide ->print_string "\n"
      |I (i,l) ->(print_string (string_of_int i));(afficheIS l);
      |S (s,l) -> print_string(s);(afficheIS l);;