【问题标题】:Concatenating strings with foldr in SML在 SML 中使用 foldr 连接字符串
【发布时间】:2010-10-10 12:55:23
【问题描述】:

我正在尝试声明一个函数,字符串列表 -> 字符串,例如使用输入 ["Chicago","city","USA"] 应该返回 "Chicago city USA"。到目前为止我所做的是:

fun gather ts = foldr op ^ "" ts;

这似乎有点像,但问题是,我想在单词之间包含空格,因为此函数将返回 "ChigagocityUSA"

【问题讨论】:

    标签: string concatenation sml fold


    【解决方案1】:

    是的,问题在于^ 是一个函数,它对两个字符串“foo”和“bar”返回“foobar”,尽管您想要“foo bar”。

    所以你需要做的是定义一个函数,它接受两个字符串参数(作为一个元组)并返回两个字符串之间有一个空格(所以string1 ^ " " ^ string2)。

    然后您可以将该函数作为参数提供给foldr 并获得您想要的结果。

    【讨论】:

    • 我真的不能让它工作,我做了一个新函数 fun hj ts = fn(a,b) => (a^" "^b);
    • @user:不确定ts 的用途,因为您不使用它。你可以只做val hj = fn (a,b) => (a^" "^b)fun hj (a,b) = (a^" "^b),它们是一样的,但更短。然后foldr hj "" ts,工作正常。
    • 啊,当然,非常感谢。有没有办法删除最后出现的空格?
    • 也许代替 fun hj (a,b) = (a^" "^b) 我可以使用类似 fun hj (a,_) = a | (a,b) => a^" "^b); ?
    • 是的,可以,但是用 (a,"") 而不是 (a,_)thanx 作为帮助伙伴:)
    【解决方案2】:

    使用hdtl 获取fold 的初始值。这样可以避免结果中出现前导或尾随空白字符。如果您想从左到右思考,foldl 很有用。

    定义:

    fun gather xs = 
          foldl (fn (x,acc) =>
                    acc  ^ " " ^ x) (hd xs) (tl xs)
    

    用法:

    - gather ["what", "is", "this", "gather"];
    val it = "what is this gather" : string
    - 
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2017-01-25
      • 2016-08-24
      • 1970-01-01
      • 2014-04-17
      • 2014-08-29
      相关资源
      最近更新 更多