以下是元素的类型:
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 = ()
答案 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);;