使用 "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 hd
是false那么你准备好直接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"]
。
鉴于这样的 x
和 y
-- 在 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;
我正在尝试编写一个执行以下操作的函数,接受:
[ #"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 hd
是false那么你准备好直接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"]
。
鉴于这样的 x
和 y
-- 在 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;