【问题标题】:How to map over each character in a string in SML如何在 SML 中映射字符串中的每个字符
【发布时间】:2016-03-02 02:49:20
【问题描述】:

我有一个函数 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));

【问题讨论】:

标签: sml smlnj ml


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    - String.map Char.succ "HAL";
    > val it = "IBM" : string
    

    【讨论】:

    • 一个简短的解释会改善这个答案。
    猜你喜欢
    • 2011-12-04
    • 2016-10-22
    • 1970-01-01
    • 2019-08-01
    • 2011-11-25
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多