【问题标题】:How can I print a list with my own type of elements in OCaml?如何在 OCaml 中使用我自己的元素类型打印列表?
【发布时间】:2014-05-06 14:09:17
【问题描述】:

这里是元素的类型:

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 = ()

【问题讨论】:

  • 在我理解了这个问题后,我已经更新了我的回复。

标签: list printing ocaml


【解决方案1】:

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

【讨论】:

  • 最初是与 l 匹配的,然后我忘记删除参数“l”。现在我已经解决了问题
【解决方案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”格式说明符。它需要两个参数:第一个是打印任意类型值的函数,第二个是该类型的值。使用说明符,您可以构建组合您的打印机。

【讨论】:

  • 您已将文件结尾输出到标准输出设备。它不会影响您尝试从数据结构创建的字符串。
  • 而且,你已经删除了一条评论......虽然,我会把它留给你,只是为了确保你理解由你的函数生成的字符串值之间的区别,以及为您输入的每个值生成的解释器的输出。
  • 我试图在评论中添加代码,因为我不允许在 10 小时后添加答案,但它不像代码,所以我编辑了我的帖子。感谢您的回复跨度>
  • 感谢您的更新!我会记住你的话,我正在考虑使用 printf 但我之前没有使用过 %a,现在我想我明白了。
【解决方案3】:

已解决:

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

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多