SML:如何将列表分成2个列表的元组?

时间:2014-11-27 17:21:38

标签: smlnj

所以,我试图解决这个问题,

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

e.g。 next [#“t”,#“h”,#“e”,#“”,#“c”,#“a”,#“t”] ==> ([#“那只猫”,#” ”…。]) : char list * char list

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

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

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

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

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

1 个答案:

答案 0 :(得分: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

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

问候,Špela