【问题标题】:SML: How to separate a list into a tuple of 2 lists?SML:如何将一个列表分成 2 个列表的元组?
【发布时间】:2014-12-22 02:10:10
【问题描述】:

所以,我正在尝试解决这个问题,它说,

编写一个函数来从字符列表中取出下一个单词。该函数将单词的元组作为字符列表和列表的其余部分返回。

例如下一个 [#”t”,#”h”,#”e”,#” “,#”c”,#”a”,#”t”] ==> ([#“那只猫”,#” ”…。]) : 字符列表 * 字符列表

• 如果列表为空,则返回两个空列表的元组

• 如果列表以非字母开头,则返回空列表和列表的元组

• 否则,从列表的尾部取出下一个单词的其余部分,返回下一个单词的其余部分和列表尾部的其余部分的元组,放入原始列表的头部,即单词的头部,到单词其余部分的前面,并返回整个单词列表和列表尾部的其余部分

• 提示:使用带有元组模式的 let 来匹配单词的其余部分和列表尾部的其余部分的元组

到目前为止我的方法: - 有趣的下一个 [] = ([],[]) | next (x::xs) = if x = chr 32 then ([],(x::xs)) else ???

【问题讨论】:

  • 澄清提示:let (tail_of_word, rest_of_list) = ... in ???。您需要在“...”部分使用递归。

标签: smlnj


【解决方案1】:

我知道这有点晚了,我不确定我是否理解正确,但这对我来说看起来不错:

fun next [] = ([], [])
  | next (hd :: tl) =
    if Char.isAlpha hd
    then
        let val (lst1, lst2) = next tl
        in (hd :: lst1, lst2)
        end
    else ([], hd :: tl)

给定的例子似乎工作正常:

- next (String.explode "the cat");
val it = ([#"t",#"h",#"e"],[#" ",#"c",#"a",#"t"]) : char list * char list

它一直分离列表的头部,直到它到达第一个单词的末尾。然后它开始将这些头收集到元组的第一个列表中。 希望对您有所帮助。

问候,斯佩拉

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2014-03-19
    • 2019-08-20
    • 2016-01-21
    相关资源
    最近更新 更多