2012-03-30 13 views
0

私はカスタムリストを逆にする関数を作りたいと思いますが、うまくいきません。前の質問で関数を提案しましたが、別の関数を使用しました。任意の外部関数、私はいくつかのコードを書いたと私はそれを動作させる方法のヒントをありがとうと思います。mylist標準の逆関数ml

datatype 'element mylist = 
    NIL 
| CONS of 'element * 'element mylist; 

fun reverse (CONS(x, NIL)) = CONS(NIL, x) 
    | reverse (CONS(x, xs)) = CONS((reverse xs), CONS(x, NIL)); 

私は取得していますエラーは次のとおりです。

stdIn:89.5-90.60 Error: right-hand-side of clause doesn't agree with function result type [circularity] 
    expression: 'Z mylist mylist mylist 
    result type: 'Z mylist mylist 
    in declaration: 
    reverse = 
     (fn CONS (<pat>,<pat>) => CONS (<exp>,<exp>) 
     | CONS (<pat>,<pat>) => CONS (<exp>,<exp>)) 

は、コードの何が問題になっているのですか?

答えて

2

リストの先頭と末尾の順序を変更しました。 CONS of 'element * 'element mylistを定義したので、CONS(head, tail)として使用する必要があります。 reverseCONS(tail, head)として使用します。このため、2つの句はreverseの矛盾するタイプを示し、エラーが発生します。引き数の順序を逆にするだけでは、CONSappend関数にするには不十分です。

逆関数には、データ型のコンストラクタに続く句を含むフォームが必要です。一つの可能​​性は、このようなものです:

fun reverse NIL = NIL 
    | reverse CONS(x, xs) = (* implementation for CONS *) 

おそらく少し簡単にあなたが結果を構築するために使用する二番目の引数を追加することです。それは次のようになります。

fun reverse'(NIL, result) = result 
    | reverse'(CONS(x,xs), result) = (* implementation for CONS *) 

reverse'(lst, NIL)のように呼び出すこと。

質問を宿題としてマークしたので、CONS句の実装は除外しました。

関連する問題