繁体   English   中英

如何在OCaml中使用自己的元素类型打印列表?

[英]How can I print a list with my own type of elements in 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 = ()

您的问题在这里: let rec afficheIS l=function您的函数afficheIS期望一个参数l (从未使用过),而您递归调用afficheIS则不提供l参数。 实际上,此l不代表任何内容,因此应将其删除。

关于如何改进代码,我有一些建议。

首先是美丽,它对于那些阅读代码的人(对于编译器而言)至关重要。 请考虑在词素之间使用空格。 阅读您的代码会容易得多。

接下来,无需放置此;;

然后我想提出一个更清洁的打印功能实现

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”格式说明符。 它需要两个参数:第一个是打印任意类型值的函数,第二个是该类型值。 使用说明符,您可以构建组合打印机。

解决了:

 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);;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM