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}リスト
式で:
   aux(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で使用されるためget_substitutions1、その引数はタイプ'a list listである必要がありxs'ますが、再帰呼び出しで使用するのはタイプのみです'a list

于 2013-01-31T01:11:50.127 に答える