[英]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.