为澄清我的困境,我将解释我面临的问题... 基本上,我正在传递的字符串可以包含单个字符或字符范围,并且正在尝试返回由我传递的字符串表示的字符列表。
例如“ b”只给出一个列表['b']“ a-z”将给出['a'; 'b'; 'C' ; ...; 'z']和类似“ ad-g2-6”的内容将是['a'; 'd'; 'e'; 'F' ; 'G' ; '2'; '3'; '4'; '5'; '6'],因为存在字符a以及范围d-g和2-6。 (还要注意,由于范围未完成,因此类似“ a-”的名称只是['a';'-']。
我解决这个问题的想法是将字符串分解成一个字符列表(lst),然后进行模式匹配并建立在像这样的累加器上
let mainfunc str = let lst = (explode str) in
let rec func lst acc = match lst with
| [] -> acc
| a::'-'::b::t -> func t (acc @ **SOMETHING TO GET THIS RANGE**)
| a::t -> func t (acc @ [a])
in func lst []
任何可以帮助我在角色之间找到距离的东西都将是很棒的,如果有人能够解决我所设定的问题之外,还有其他更好的方法可以解决问题,那么我愿意接受。
(还要注意,我的explode函数可以按预期工作,并将字符串转换为char列表)
答案 0 :(得分:1)
自从您成功编写了explode
函数以来,我将假定您在递归等方面没有问题。因此,问题可能只是将字符作为值进行讨论的一种方式(因此您可以在后面获得下一个字符)给定的一个)。
为此,您可以使用Char.code
和Char.chr
(来自OCaml标准库)。
这是一个接受字符并按顺序返回由字符和下一个字符组成的列表的函数:
let char_pair c =
[ c; Char.chr (Char.code c + 1) ]
运行时的外观如下:
# char_pair 'x';;
- : char list = ['x'; 'y']
(作为练习,我将处理代码为255的字符作为问题。)
作为旁注,您的方法对我来说很好。看起来会起作用。