2013-11-21 2 views
1

Я знаю, как работает код, за исключением переменной х здесь: НЕКОТОРЫХ у => НЕКОТОРЫХ (х :: у)Как именно этот код работает?

fun same_string(s1 : string, s2 : string) = 
    s1 = s2 

fun all_except_option (str, xs) = 
    case xs of 
    [] => NONE 
    | (x::xs') => case (same_string(str,x)) of 
       true => SOME xs' 
      | false => case all_except_option(str,xs') of 
        NONE => NONE 
        | SOME y=> SOME (x::y) 

Как "х" держит [ "а", "б "], когда вы возвращаете НЕКОТОРЫЕ (x :: y)?

val test1 = all_except_option("string", ["a","b","string","c"]) = SOME ["a","b","c"] 

ответ

1

Это не так. y имеет список ["b","c"], связанный с ним, и x имеет "a", связанный с ним.

Принимая x::y, затем приводит список "a"::["b","c"] = ["a","b","c"].

Stepping через код с начала:

"string" <> "a", поэтому рекурсивный вызов выполняется.
"string" <> "b", поэтому другой рекурсивный вызов сделан.
"string = "string", поэтому SOME ["c"] возвращается с первого рекурсивного вызова.
Теперь x держит "b" и y держит в первом рекурсивном вызове ["c"], и поэтому SOME "b"::["c"] = SOME ["b","c"] возвращается.
Наконец, x держит "a" и y держит в вызове верхнего уровня ["b","c"], и так SOME "a"::["b","c"] = SOME ["a","b","c"] возвращается из этого вызова, чтобы конечный результат.

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