【问题标题】:How to print list as int in OCaml?如何在 OCaml 中将列表打印为 int?
【发布时间】:2017-12-13 04:57:02
【问题描述】:

假设我有任何列表,例如

let lista = [1;2;3;4;5;6]

如何写成

int = 123456

以便我以后可以将其传递给函数?

我试过了

  let rec print lista =
  match lista with
  []->()
  |a::lista ->print_int a; print lista;;

但我没有得到预期的结果,只有

 - : unit = ()

我知道 int_of_string,所以我的函数是返回 string 还是 int 并不重要。

【问题讨论】:

  • 你试过什么?你会用笔和纸怎么做?
  • 我编辑了我的帖子以展示我尝试过的内容
  • 您想遍历整数列表,从中创建一个字符串,然后将其传递给函数吗?还是您想从整数列表中创建一个新整数?
  • 将 int 传递给另一个函数,但由于 int_of_string 存在,所以没关系
  • 你的函数没有返回任何东西,因为它只是打印值。您似乎想将每个元素转换为字符串并连接直到列表中没有更多元素,然后将该字符串转换为 int 然后返回。试试这个,而不是打印

标签: list int ocaml


【解决方案1】:

一个可能的解决方案:

lista 
|> List.fold_left (fun a x -> a * 10 + x) 0;;

累加器乘以 10,我们添加列表的当前元素

将累加器初始化为0的第二个参数。

List.fold_left 对于处理列表非常有用。

如果需要打印结果修改代码添加行直接打印结果:

lista 
|> List.fold_left (fun a x -> a * 10 + x) 0
|> print_int;;

【讨论】:

    【解决方案2】:

    您已经非常接近解决方案:您应该为每个数字生成一个字符串并将它们附加在一起,而不是printing 标准输出的解决方案。以下是您需要的功能:

    val string_of_int : int -> string

    val (^) : string -> string -> string

    或者,您可以绕过 int_of_string 并通过注意以下事项来实施直接解决方案:

    to_int [a; b; ...; c; d] = ab...cd
                             = d + 10 * (c + 10 * (... + 10 * (b + 10 * c)))
    

    即这有一个简洁的递归结构。

    【讨论】:

    • 但是我的函数不会返回任何东西,只有- : unit = ()
    • 如果你 print 的东西,是的。但是如果你构建一个string,它的类型是[int] -> string
    • 那么该怎么做呢?我没有想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多