2015-11-05 20 views
0

我试着编写执行以下操作的功能,发生在:使用“让”给一个元组分配到SML值

[ #"t" ,#"h" ,#"e" ,#" " ,#"c" ,#"a" ,#"t" ] 

以下是输出:

([#"t" ,#"h" ,#"e" ] , [#" " ,#"c" ,#"a" ,#"t" ]) 

到目前为止,我..

fun isLetter c = #"a" <= c andalso c <= #"z"; 
//(this works fine and is used within the main function wordPop) 

fun wordPop [] = ([],[]) 
    | wordPop (hd::tl) = if not (isLetter hd) 
         then ([], hd::tl) 
         else (* ...not too sure... (1) *) 

我知道我必须做一些事情,看起来像这样的(1)

let (wordPop tl) in (x,y) end; 

并以某种方式将x添加到x。但不是100%确定如何做到这一点。

+0

看来你正试图清单分成两半,在这种情况下的事实,这是一个字符的列表是不相关的。也许你可以解释你正在努力做得更清楚。 –

+0

好的,我给了一个短语,这个短语是上面显示的输入形式。我必须将这个输入分解成一个元组,其中第一个是该短语中的第一个单词,第二个是该短语的其余部分。我不确定这是否足够清楚,对不起,我说话不太好。 – James

+0

所以你可以看到我正在检查列表中的第一个值是否是一个字母(如果它不是那么这是一个空间,在这种情况下它是第一个单词的结尾),如果它是,那么我需要能够在我使用最新的短语的同时逐步完成创建新元组的功能。那么,在到达非字母字符后,它应该返回元组。 – James

回答

2

听起来像功课,所以这里是一个暗示:

在非基础的情况下(hd::tl),如果isLetter hd那么你就准备直接返回的东西(无需递归函数调用)。如果输入看起来像explode(" cat")(即[#" ", "c", "a", "t"] - 注意空间),请仔细考虑要返回的内容。

至于另一种情况(isLetter hd评估为true),假设您正在处理“他猫”中的字符。然后hd = #"h"tl = [#"e", #" ", "c", "a", "t"]。 如果在这种情况下,你执行

let val (x,y) = wordPop tl 

然后x = [#"e"]y = [#" ", "c", "a", "t"]

鉴于这样的xy - 您想在返回之前将hd = #"h"放在哪里?

+0

嗯,我会说return(hd :: x,y)。 – James

+0

所以它会很有趣wordPop [] =([],[])| wordPop(hd :: tl)if(not(isLetter hd))then([],tl)else let val(hd :: x,y)= wordPop t1; ....我感觉我没有得到这一点。 – James

+0

@詹姆斯几乎在那里。 1)'if'之前需要'=','else'之后的部分应该开始'let val(x,y)= wordPop tl in ... end;' –

1

最终的解决方案我:

fun isLetter c = #"a" <= c andalso c <= #"z"; 

fun wordPop [] = ([],[]) | 
    wordPop (hd::tl) = if(not (isLetter hd)) 
          then ([],(hd::tl)) 
          else let val (x,y) = wordPop tl in (hd::x,y) end; 
+0

好!这正是我想到的解决方案。 –

+0

如果没有你,不可能完成它,再次感谢:)! – James