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)

这个函数接受一个字符串列表和一个类型:

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

我得到一个错误:

错误:运算符和操作数不一致。

运算符域:字符串列表列表 *
                 {first:string, last:string, middle:string} 列表
操作数:字符串列表 *
                 {first:string, last:string, middle:string} 列表
表达:
   辅助 (xs',{first=x,middle=b,last=c}::acc)

还有其他方法吗?

4

1 回答 1

4

首先,您可能不想缩进您的代码以使其可读。

很明显为什么你会得到你所做的错误。功能

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

并且您尝试在内部 case 表达式中使用此函数的结果,在该表达式中,您获取返回列表的尾部(type '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是 in get_substitutions1,因此该参数必须是 type 'a list list,但xs'您在递归调用中使用的 down 只是 type 'a list

于 2013-01-31T01:11:50.127 回答