【问题标题】:Using "let" to assign a tuple to a value in sml使用“let”将元组分配给 sml 中的值
【发布时间】:2016-02-06 19:31:45
【问题描述】:

我正在尝试编写一个执行以下操作的函数:

[ #"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% 确定如何做到这一点。

【问题讨论】:

  • 您似乎正试图将一个列表分成两半,在这种情况下,它是一个字符列表这一事实并不相关。也许你可以更清楚地解释你想要做什么。
  • 好的,给我一个词组,这个词组就是上面显示的输入形式。我必须将此输入拆分为一个元组,其中第一个是短语中的第一个单词,第二个是短语的其余部分。我不确定这是否足够清楚,对不起,我的文字不太好。
  • 如您所见,我正在检查列表中的第一个值是否是字母(如果不是,那么它是一个空格,在这种情况下它是第一个单词的结尾)如果是这样,那么我需要能够在使用最新短语时逐步执行创建新元组的函数。然后,在它到达一个非字母字符后,它应该返回元组。
  • 所以你想分割第一个非字母,将第一个非字母保留为下半部分的一部分。请注意,您的 isLetter 过于冗长:只需使用 fun isLetter c = #"a" &lt;= c andalso c &lt;= #"z";
  • 我想在第一个非字母上拆分,左半边是单词,右半边是短语的其余部分,即(一些伪代码,其中 | 表示左元组值和正确的元组值)你好这是一个例子=>你好|这是一个例子

标签: tuples sml let


【解决方案1】:

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

在非基础情况(hd::tl) 中,如果isLetter hdfalse,那么您就可以直接返回某些内容(无需递归函数调用)。如果输入看起来像explode(" cat")(即[#" ", "c", "a", "t"]——注意空格),请仔细考虑要返回的内容。

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

let val (x,y) = wordPop tl

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

鉴于xy —— 你想在返回之前将hd = #"h" 放在哪里?

【讨论】:

  • 嗯,我会说 return (hd::x, y)。
  • 这样会很有趣 wordPop [] = ([],[]) | wordPop (hd::tl) if( not (isLetter hd)) then ([], tl) else let val (hd::x,y) = wordPop tl; ....我觉得我根本没有得到这个。
  • @James 快到了。 1)你需要在if之前=else之后的部分应该开始let val (x,y) = wordPop tl in ... end;
  • 非常感谢,终于到了。 :)!
【解决方案2】:

我得到的最终解决方案:

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;

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 2020-06-11
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多