【发布时间】: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" <= c andalso c <= #"z"; -
我想在第一个非字母上拆分,左半边是单词,右半边是短语的其余部分,即(一些伪代码,其中 | 表示左元组值和正确的元组值)你好这是一个例子=>你好|这是一个例子