如何从ocaml中的用户输入获取char列表

时间:2017-02-21 12:56:43

标签: list functional-programming ocaml user-input

我找不到从用户给出的值中获取列表的方法。我已经做了

  # read_line() |> Str.split (Str.regexp " +") |> List.map int_of_string;;

但不知道如何为字符做同样的事情。

2 个答案:

答案 0 :(得分:1)

请记住,字符串是char:

的数组
  # let s = "ab";;
  # s.[0];;
  - : char = 'a'

因此,如果您必须为列表中的任何元素返回一个字符:

 #  read_line() |> Str.split (Str.regexp " +") |> List.map (fun x -> x.[0])

答案 1 :(得分:0)

从您之前的问题的上下文中,您似乎确实需要一种方法来解析包含描述状态机转换的整数和字符混合的文本。我建议您最好使用Scanf模块。但是,如果你需要更复杂的东西,这可能需要一个手写扫描仪(你可以使用Str.string_match或者 - 如果你愿意深入潜水 - 使用ocamllex扫描仪生成器)。

使用Scanf从通道读取一行的简单示例如下:

let read_transition input =
  try
    let line = input_line input in
    Scanf.sscanf line "%d %c %d"
      (fun x ch y -> Some (x, ch, y))
  with End_of_file -> None

请注意,我们正在使用input_line读取该行,而不是直接在输入通道上使用Scanf.scanf。原因是Scanf.scanf可能需要一个前瞻性的角色,因此,如果您将其与其他阅读频道的方式混合,则可能会跳过字符。通过使用input_line然后使用Scanf.sscanf(而不是Scanf.scanf),我们可以避免这种情况。

另请注意,根据输入的语法,您可能需要相应地调整scanf模式。