2015-11-05 2 views
0

Im пытается написать функцию, которая выполняет следующие действия, принимает в:Использование «пусть», чтобы назначить кортеж значения в 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% уверен, как это сделать.

+0

кажется, что вы пытаетесь разделить список на пару половинок, и в этом случае тот факт, что это список символов не имеет значения. Возможно, вы можете объяснить, что вы пытаетесь сделать более четко. –

+0

Хорошо, мне дана фраза, эта фраза находится в форме ввода, показанного выше. Я должен разбить этот вход на кортеж, где первая в паре является первым словом во фразе, а вторая в паре - остальная часть фразы. Я не уверен, что это достаточно ясно, извините, я не так хорош со словами. – James

+0

, так что вы можете видеть, что я проверяю, является ли первое значение в списке буквой или нет (если это не тогда, это пространство, в этом случае это конец первого слова), если это тогда, мне нужно быть в состоянии шаг, хотя функция создания новых кортежей, поскольку я иду с самой современной фразой. то после того, как он достигнет символа, отличного от буквы, он должен вернуть кортеж. – James

ответ

2

Походит домашнее задание, так вот подсказка:

В не базису случае (hd::tl), если isLetter hd является ложной тогда вы готовы непосредственно вернуть что-то (нет необходимости в вызове рекурсивной функции). Подумайте о том, что вы хотите вернуть, если вход выглядит как explode(" cat") (т. Е. [#" ", "c", "a", "t"] - обратите внимание на пробел).

Что касается другого случая (isLetter hd, оценивающего значение true), предположим, что вы обрабатываете символы в «he cat». Затем hd = #"h" и tl = [#"e", #" ", "c", "a", "t"]. Если в этом контексте вы выполняете

let val (x,y) = wordPop tl 

затем x = [#"e"] и y = [#" ", "c", "a", "t"].

С учетом таких x и y - где вы хотите разместить 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 tl; .... У меня такое чувство, что я этого не понимаю. – James

+0

@James Почти там. 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

 Смежные вопросы

  • Нет связанных вопросов^_^