0

これは紛らわしいですが、機能するコードです。k::ksが「リストリスト」ではなく「リストリストリスト」として扱われる理由を理解するのに少し助けが必要です。リストとリストのリストを取り、最初のリストが必要かどうかを確認したいと思います。つまり、最初のリストのすべての要素が別のリストにあるかどうかということです。

fun do1(a,[],_)=false
|do1(a,k::ks,n)=if a=List.nth(k,n)orelse do1(a,ks,n) then true else false;

val n=0;
fun do2([],k::ks,_)=[]
|do2(_,[],_)=raise unexpected
|do2(l,k::ks,n)=if List.nth(l,n-1)=0 then do2(l,k::ks,n+1)
                        else 
                        if do1(l,k::ks,n) then []
                        else l;

繰り返される質問:k::ksが「リストリスト」ではなく「リストリストリスト」として扱われる理由を理解するのに少し助けが必要です。

ありがとうございました。

4

2 に答える 2

0

このタイプのコードは実際にはアイデアを交換しませんが、ソリューションを含めました。

関数では、

fun do2([],k::ks,_)=[]
|do2(_,[],_)=raise unexpected
|do2(l,k::ks,n)=if List.nth(l,n-1)=0 then do2(l,k::ks,n+1)
                        else 
                        if do1(l,k::ks,n) then []
                        else l;

最後から2番目の行

if do1(l,k::ks,n) then []

する必要があります

if do1(List.nth(l,n-1),k::ks,n) then []
于 2012-11-27T21:43:38.073 に答える
0

の定義ではdo2lはリストです。次に、を最初の引数としてdo2呼び出すため、、、の最初のパラメーターもリストになります。2行目で、あなたはそうします。したがって、はリストなので、リストでもある必要があります。これは、リストのリストでなければならないことを意味します。そしてそれは今度はそれがリストのリストのリストでなければならないことを意味します。do1ldo1aa = List.nth(k,n)aList.nth(k,n)kk::ks

PS:一般に、コンパイラが予想とは異なる型を推測する理由を見つけようとするときは、関数定義に型注釈を追加すると役立ちます。多くの場合、結果として生じるタイプエラーにより、関連するタイプに関するコンパイラの意見があなたの意見とどこで異なり始めるかについて、はるかに明確な考えが得られます。

于 2012-11-27T21:31:32.257 に答える