2

私は Ocaml を初めて使用し、ネストされたリストを次のように定義しました。

    type 'a node = Empty | One of 'a | Many of 'a node list

ここで、ネストされたリストの最初の順序のメンバーを角括弧で囲むラッピング関数を定義したいと考えています。例のために。wrap( Many [ one a; Many[ c; d]; one b; one e;] ) は Many [Many[one a;] を返します。空の]; 多くの[多くの[c;d]; 空の]; 多く[b; 空の]; 多く[e; 空の]]。これが私のコードです:

    let rec wrap list = function
         Empty -> []
        | Many[x; y] -> Many [ Many[x; Empty]; wrap y;];;

しかし、最後の式でエラーが発生しました: この式にはタイプ 'a ノードがありますが、タイプ 'b リストの式が予期されていました。助けてください。

4

1 に答える 1

2

2 つの一致が同じ型の値を返していません。最初のステートメントは b' リストを返します。2 番目のステートメントは 'a ノードを返します。型チェッカーを通過するには、最初のステートメントを次のように変更する必要がありますEmpty -> Empty

2 つ目の問題 (次に遭遇する問題) は、再帰呼び出しに正しい型の値が与えられていないことです。wrap : 'a node -> 'a node、しかしy : 'a node list。これに対処する 1 つの方法は、式を に置き換えることwrap (Many y)です。

現在の関数がManyリストに2つの要素しかないと想定しているという点でも問題があります。あなたがやりたいことは だと思いますMany (x::y)。これは、x をリストの先頭として、y を末尾として一致させます。Many ([])ただし、無限再帰を回避するためにケースを処理する必要があります。

最後に、あなたの関数の全体的な形は少し変わっていると思います。に置き換えfunction Empty -> ...ますmatch list with | Empty -> ...

于 2013-06-02T13:19:33.473 に答える