如何在SML中映射字符串中的每个字符

如何在SML中映射字符串中的每个字符,sml,smlnj,ml,Sml,Smlnj,Ml,我有一个函数foo,它接受一个字符。我想将该函数映射到字符串中的每个字符上 fun foo (ch : char) = ch; fun bar (str : string) = map foo [(str)]; 显然,这将不起作用,因为一个字符串应用于一个需要字符的函数。因此,我尝试使用String.explode(str)将其分解为一个字符数组,但似乎无法映射数组中的每个字符并将该字符应用于foo函数 fun foo (ch : char) = ch; fun ba

我有一个函数foo,它接受一个字符。我想将该函数映射到字符串中的每个字符上

fun foo (ch : char) =
    ch;
fun bar (str : string) =
    map foo [(str)];
显然,这将不起作用,因为一个字符串应用于一个需要字符的函数。因此,我尝试使用String.explode(str)将其分解为一个字符数组,但似乎无法映射数组中的每个字符并将该字符应用于foo函数

fun foo (ch : char) =
     ch;
fun bar (str : string) =
    map foo [(String.explode(str))];
如何将函数映射到字符串中的每个字符

编辑: 我想把foo改成2个参数

fun foo(ch : char, i : int) =
    ch;
fun bar(str : string) =
    map foo (String.explode(str), 1);
但这给了我一个泰康错配

operator domain: (char * int) list
operand:         char list * int
为什么以前map函数理解String.explode(str)映射每个字符,但现在它将其视为完整的字符列表

编辑2:没关系,算了吧

fun bar(str : string) =
    map (fn x => foo (x, 1)) (String.explode(str));

当您想对每个字符进行
映射
时,您给
映射
的列表必须是字符列表
explode
返回字符列表,因此使用
explode
绝对是正确的想法。但是您将
explode
返回的列表放入另一个列表中,从而生成一个字符列表。这就是为什么会出现类型错误


只需删除外部列表,您的代码就可以按您的意愿工作。

如果您想避免代价高昂的爆炸/内爆,还可以使用
CharVector.map
,它的类型为
(char->char)->string->string
()。简单的解释可以改进这个答案。
- String.map Char.succ "HAL";
> val it = "IBM" : string