ГРЕШКА: Списък със списък с низове вместо списък с низове

Имам тази функция, която води до списък с низове:

fun get_substitutions1 ([],_) = []
| get_substitutions1 (x::xs,s) = case all_except_option(s,x) of
    NONE     => []  @get_substitutions1(xs,s)
  | SOME lst => lst @get_substitutions1(xs,s)

И тази функция, която приема списък от низове и тип:

fun similar_names(slist,full_name:{first:string,middle:string,last:string})=
let
fun aux(slist,acc)=
case full_name of
{first=a,middle=b,last=c} => case get_substitutions1(slist,a) of
[] => full_name::acc
| x::xs'  => full_name::  aux(xs',{first=x,middle=b,last=c}::acc)

in aux(slist,[])
end

И получавам грешка:

Error: operator and operand don't agree.

operator domain: string list list * 
                 {first:string, last:string, middle:string} list
operand:         string list * 
                 {first:string, last:string, middle:string} list
in expression:
   aux (xs',{first=x,middle=b,last=c} :: acc)

Има ли друг начин?


sml
person Rea    schedule 31.01.2013    source източник


Отговори (1)


Е, първо, може да не искате да правите отстъп в кода си, така че да е четим.

Съвсем очевидно е защо получавате грешката, която правите. Функцията

fun get_substitutions1 ([],_) = []
  | get_substitutions1 (x::xs,s) =
    case all_except_option(s,x) of
      NONE => []@get_substitutions1(xs,s)
    | SOME lst => lst @get_substitutions1(xs,s)

има вида

val get_substitutions1 = fn : ''a list list * ''a -> ''a list

и вие се опитвате да използвате резултата от тази функция във вашия израз за вътрешен регистър, където вземате опашката на върнатия списък (тип 'a list) и ги използвате в рекурсивното извикване на функция.

fun similar_names(slist,full_name:{first:string,middle:string,last:string})=
    let
      fun aux(slist,acc)=
          case full_name of
            {first=a,middle=b,last=c} =>
            case get_substitutions1(slist,a) of
              [] => full_name::acc
            | x::xs'  => full_name::  aux(xs',{first=x,middle=b,last=c}::acc)
    in aux(slist,[])
    end

Но тъй като вашият първи аргумент от aux се използва в get_substitutions1, този аргумент трябва да е от тип 'a list list, но xs', който използвате надолу в рекурсивното извикване, е само от тип 'a list.

person Jesper.Reenberg    schedule 31.01.2013
comment
Знам, че get_substitutions1 води до списък с низове. Но моята помощна функция взема списък със списък с низове. Объркан съм, защото искам рекурсията с резултата от списъка с низове. Можете ли да ми помогнете? - person Rea; 31.01.2013
comment
Ако знаете това, тогава защо не сте го поправили? Може би трябва да преформулирате въпроса си, за да бъдете малко по-ясни, какво всъщност е това, което не разбирате - person Jesper.Reenberg; 31.01.2013
comment
Единственото нещо, което мога да кажа повече, е, че изглежда, че използвате или входа, или резултатите от get_substitutions1 по грешен начин. - person Jesper.Reenberg; 31.01.2013
comment
Не мога да намеря друг начин да правя това, което искам. Мисля, че логиката ми е правилна, но губя нещо. Поне нещо очевидно ли е? - person Rea; 31.01.2013