【问题标题】:Standard ML: Using foldr to create a string out of int list标准 ML:使用 foldr 从 int 列表中创建字符串
【发布时间】:2020-12-23 04:27:03
【问题描述】:

我正在尝试在标准 ML 中创建一个函数,以从 int 列表 [1,2,3,4] 创建一个字符串,使其看起来像 "1, 2, 3, 4"

我设法创建的是一个函数,它可以通过迭代并转换为字符串并添加“,”来完成这项工作。但由于我在每次迭代后连接逗号,因此逗号也会出现在字符串的末尾。

这是我的功能:

fun list_string lst =
    (foldr (fn (x, y) => x ^ ", " ^ y ) "" (List.map (fn x => Int.toString(x)) lst));

你可以看到问题,一旦到达末尾,它仍然会打印逗号。 有没有办法我可以使用 foldr 向部件添加一个函数,以便它可以检查最后一个元素?

【问题讨论】:

    标签: sml


    【解决方案1】:

    只有当您不在列表的第一项时,您才可以添加逗号。这可以通过将y 与空字符串进行比较来简单地检查:

    fun list_string lst = (List.foldr (fn (x, y) => if y = "" then x else x ^ "," ^ y)
                      "" (List.map (fn x => Int.toString(x)) lst));
    
    print(list_string([1, 2, 3]));
    

    您也可以通过模式匹配来做到这一点,而无需先将您的 int 列表映射到字符串列表。因此,您只遍历您的列表一次。我认为这也更具可读性:

    fun list_string lst = List.foldr (
          fn (x, "") => (Int.toString x)
          |  (x, y)  => (Int.toString x) ^ "," ^ y) "" lst;
    print(list_string([1, 2, 3]));
    

    【讨论】:

      【解决方案2】:

      你可以通过折叠来做到这一点:

      fun commaSep [] = ""
        | commaSep (n0::ns) =
            foldl (fn (n, s) => s ^ ", " ^ Int.toString n) 
                  (Int.toString n0)
                  ns
      

      或者你可以使用concatmapintersperse

      fun intersperse x [] = []
        | intersperse x [y] = [y]
        | intersperse x (y::zs) = y :: x :: intersperse x zs
      
      val commaSep = String.concat
                   o intersperse ", "
                   o List.map Int.toString
      

      【讨论】:

        猜你喜欢
        • 2014-04-02
        • 2015-04-05
        • 1970-01-01
        • 2023-03-12
        • 2011-01-12
        • 1970-01-01
        • 2013-07-14
        • 2015-01-10
        • 2021-02-07
        相关资源
        最近更新 更多