2

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

fun foo (ch : char) =
    ch;
fun bar (str : string) =
    map foo [(str)];

显然,由于将字符串应用于需要 char 的函数,这将不起作用。所以我尝试使用 String.explode(str) 将其分解为一个 char 数组,但是我似乎无法映射数组中的每个 char 并将 char 应用于 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));
4

2 回答 2

2

当您想要map覆盖每个字符时,您提供的列表map必须是字符列表。explode返回一个字符列表,所以使用explode绝对是正确的想法。但是您将返回的列表explode放入另一个列表中,从而产生一个字符列表列表。这就是您收到类型错误的原因。

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

于 2013-04-21T15:33:55.153 回答
0
- String.map Char.succ "HAL";
> val it = "IBM" : string
于 2016-03-01T18:49:20.130 回答