1

だから私はこのタプルのリスト(n = 2)を持っています、魔女は「解凍」することになっていて、それによって新しいリストを作成することになっています: (2,"two") :: nil : (int,string) alterlist、unzip 関数は [(1,2),("one", "two")] のようなリストを作成します。これは私がこれまでに得たものです:

datatype ('a, 'b) alterlist = nil | :: of ('a*'b) * ('a, 'b) alterlist; 
infixr 5 :: 

fun build4(x, one, y, two) = (x,one)::((y,two)::nil);

fun unzip(alterlist) = 
let 
    fun extract([], i) = []
        | extract((x,y)::xs, i) = if i=0 then x::extract(xs, i)
            else y::extract(xs, i);
in
    (extract(alterlist, 0))::(extract(alterlist, 1))
end;

しかし、私はたくさんのエラーを受け取ります:

stdIn:48.6-50.26 Error: parameter or result constraints of clauses don't agree [tycon mismatch]
  this clause:      ('Z,'Y) alterlist * 'X -> 'W
  previous clauses:      'V list * 'U -> 'W
  in declaration:
    extract =
      (fn (nil,i) => nil
        | (<pat> :: <pat>,i) =>
            if <exp> = <exp> then <exp> :: <exp> else <exp> :: <exp>)
stdIn:49.41-49.58 Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z list * 'Y
  operand:         ('X,'W) alterlist * int
  in expression:
    extract (xs,i)
stdIn:50.9-50.26 Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z list * 'Y
  operand:         (_ * _,'X) alterlist * int
  in expression:
    extract (xs,i)
stdIn:48.6-50.26 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch]
  expression:  (_,_) alterlist
  result type:  'Z list
  in declaration:
    extract =
      (fn (nil,i) => nil
        | (<pat> :: <pat>,i) =>
            if <exp> = <exp> then <exp> :: <exp> else <exp> :: <exp>)

そして、私はmlが初めてなので、何が原因なのかほとんどわかりません。助けていただければ幸いです。

4

1 に答える 1

2

私のアドバイスは、少し紛らわしいので、最初に中置演算子なしで行うことです。最初になしで解決し、後で追加します。

中置記号なしの解決策は次のとおりです。

  datatype ('a,'b)alterlist =   Nil 
                            |   element of 'a*('b,'a)alterlist;                         

fun unzip (Nil : ('a,'b)alterlist ) = ([],[])
  | unzip (ablist : ('a,'b)alterlist)  =
    let 
    fun extract  Nil = []
      | extract (element (curr, Nil)) = curr::[]
      | extract (element (curr, element(_,rest))) = curr::(extract rest)
    val element (_, balist) = ablist
    in
    (extract ablist, extract balist)
    end;

たとえば、次のようなリスト: ["a", 1, "b", 2] は次のように作成されます。

element ("a", element (1, element ("b", element (2, Nil))));

あなたに与える:

val it = element ("a",element (1,element #)) : (string,int) alterlist

* # は、リストが表示されているよりも長いことを示すためのものです。

そして、試してみると、次のようにunzip it; なります。

val it = (["a","b"],[1,2]) : string list * int list

あなたが望むように。

要素を :: 中置演算子に変更してみてください。

幸運を!

于 2014-05-23T21:43:50.940 に答える