SML, как изменить строку после сравнения isSubstring - PullRequest
0 голосов
/ 04 мая 2020

В настоящее время я изучаю SML / NJ из-за программы, которая в основном использует gui для ввода c, но ввод SML для расширенных параметров. Я хочу сравнить, является ли одна строка подстрокой другой. Если условие истинно, тогда полная строка должна «просто» быть возвращена или присвоена новой переменной. В целях тестирования я использовал онлайн-компилятор, потому что я получаю почти нулевую обратную связь от другой программы.

Соответствующий фрагмент кода:

 fun SString(sub:string, str:string):string = 
     if isSubstring(sub, str) = TRUE then str 
      (* str should be returned , no errors*)
                                 else val p2:string="nope"; 
                    (* no return or adjustable(fixed)return /without data*)

   val p1 = "sender,time,data"
   val p2 = "sender" 

 print(SString(p2,p1))

Пока я застрял.

Мои основные вопросы:

  1. Могу ли я на самом деле создать новую переменную в функции?

  2. Какова наилучшая практика в этом случае?

  3. В некоторых онлайн-документах я читал, что невозможно присвоить новое значение переменной после ее назначения. Должна ли моя функция иметь следующую форму с внутренними привязками и let decl in expr end *var?

  fun newstr:string(sub:string,str:string) = 
    let val n = isSubstring(sub,str)
    in 
    end *sub

Заранее спасибо

Соответствующие результаты компиляции:

Standard ML of New Jersey v110.78 [built: Thu Aug 31 03:45:42 2017]
- stdIn:4.33-4.44 Error: syntax error: deleting  ELSE VAL ID
- stdIn:4.52-4.61 Error: syntax error: deleting  EQUALOP STRING SEMICOLON 

PS Я добавил подходящие теги, не стесняйтесь удалять / настроить их

1 Ответ

0 голосов
/ 08 мая 2020

Небольшое введение в ML дало мне отличное понимание SML, за исключением некоторых крипти c кодов и преобразований типов.

val p1:string = "weather,maps,translate"; 
val p2:string = "maps";

fun SString(sub:string, str:string) = let 
    in case (String.isSubstring sub str) of 
    (true) => str ^ ",pie"
    | (_) => "nope"
    end; 

val a = SString(p2,p1);
val b = String(p1,p2);

Выполненный результат кода выше:

Standard ML of New Jersey v110.78 [built: Thu Aug 31 03:45:42 2017]
- val p1 = "weather,maps,translate" : string
  val p2 = "maps" : string
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]  
[autoloading done]
val SString = fn : string * string -> string
val a = "weather,maps,translate,pie" : string
val b = "nope" : string
...