使用 "let" 将元组分配给 sml 中的值

Using "let" to assign a tuple to a value in 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;

并以某种方式将 hd 添加到 x。但不是 100% 确定如何执行此操作。

听起来像是作业,所以这里有一个提示:

在非基础情况下(hd::tl),如果isLetter hdfalse那么你准备好直接return东西(不需要用于递归函数调用)。如果输入看起来只是 explode(" cat")(即 [#" ", "c", "a", "t"]——注意 space),请仔细考虑您想要 return 的内容。

至于另一种情况(isLetter hd 评估为真),假设您正在处理 "he cat" 中的字符。然后 hd = #"h"tl = [#"e", #" ", "c", "a", "t"]。 如果在此上下文中执行

let val (x,y) = wordPop tl

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

鉴于这样的 xy -- 在 returning 之前你想把 hd = #"h" 放在哪里?

我得到的最终解决方案:

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;