0

2 つのリストを 1 つに圧縮する SML 関数を定義しようとしました。

fun zip(vs:string list, ps:int list) : string*int list =
    case (vs,ps) of
       (v::vv,p::pp) => (v,p) :: zip(vv,pp)
     | _ => []

しかし、それはそのようなエラーを報告します:

stdIn:3.20-3.39 Error: operator and operand don't agree [tycon mismatch]
  operator domain: (string * int) * (string * int) list
  operand:         (string * int) * (string * int list)
  in expression:
    (v,p) :: zip (vv,pp)

エラーが理解できず、関数のどこが間違っているのかわかりません。

修正方法は?

4

2 に答える 2

0

ほとんど同等ですが、次のほうがきれいだと思います。

fun zip ([], []) = []
  | zip (v :: vs, p :: ps) = (v, p) :: zip(vv, pp)

違いは、リストの長さが等しくない場合に失敗することです。失敗するか、空のリストのいずれかが空の場合に空のリストを返すことで、これを処理できます (現在行っているように)。

こちらzipをご覧zipEqくださいhttp://www.standardml.org/Basis/list-pair.html

于 2013-10-22T20:51:43.767 に答える
0

私はあなたがこれを意味したと思います:

fun zip(vs:string list, ps:int list) : (string * int) list =
    case (vs,ps) of
       (v::vv,p::pp) => (v,p) :: zip(vv,pp)
     | _ => []

(string * int) listは と同じではないことに注意してくださいstring * int liststring * (int list)この後者は、SML エラー メッセージが言っていることとして解釈されます。

実際のところ、型は何でも取り除くことができ、型推論のおかげで修正されます。

fun zip(vs, ps) =
    case (vs,ps) of
       (v::vv,p::pp) => (v,p) :: zip(vv,pp)
     | _ => []
于 2013-10-22T16:45:31.483 に答える