我找不到从用户给出的值中获取列表的方法。我已经做了
# read_line() |> Str.split (Str.regexp " +") |> List.map int_of_string;;
但不知道如何对字符做同样的事情。
请记住字符串是一个字符数组:
# let s = "ab";;
# s.[0];;
- : char = 'a'
因此,如果您必须为列表中的任何元素返回字符:
# read_line() |> Str.split (Str.regexp " +") |> List.map (fun x -> x.[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 模式。