2

SML で教会の数字を作成する課題があります。私は周りを見回しましたが、私が間違っていることを見つけることができません。目標は、int を取り、教会の数字を返す関数を作成することです。これは、データ型 'a 数字 = Num of ('a -> 'a) -> 'a -> 'a (私の先生によって事前定義されています) として定義されます。 . 次に、教会の数字を取り、int を返す 2 番目の関数を作成します。

コードを含む以前の投稿を見ました:

val ZERO = C(fn (f,x) => x)
fun subCreate 0 (f,x) = x
   | subCreate n (f,x) = f (subCreate (n-1) (f,x))
fun create n = C(fn (f,x) => subCreate n (f,x));
fun churchToInt (c, cn) = cn ((fn x => x+1), 0) 0;

しかし、これは機能せず、値の制限のために一般化されていないエラー型変数がダミー型にインスタンス化されます。

コードを使用したとき:

val zero = fn s => fn x => x; 

(ゼロを定義するため)そして次に

val next = fn n => fn s => fn x => (f ((n s) x));

(反復関数または再帰関数を設定する前に、ゼロをインクリメントできるかどうかをテストするためだけに)、同じエラーが発生しました。私はこの問題に何時間も費やしましたが、教会の数字を出すことができませんでした. 誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

2

SML'97 の「値ポリモーフィズム」に陥っていると思います。これについて説明しているドキュメントの非常に長いセクションがあります

回避策の 1 つは、この問題の原因となる式があるときはいつでも、たとえばnext zero、関数をラップすることfn x => next zero xです。

私ができると思うもう 1 つのことは、インタープリターの最上位で定義を評価する代わりに、定義とそれを使用するすべてのコードをローカル スコープ (例: 内let ... in ... end) または関数にラップすることです。

于 2012-02-06T08:55:24.040 に答える