シグネチャは何も実装しません。それは外の世界に構造がどのように見えるかを記述します。それを仕様と考えてください。それにマッチする構造体は、シグネチャ内の要素の実装を提供する必要があります。あなたのコードを実行したときに次のエラーを取得することに注意してください:
Error: unmatched type specification: bigint
SMLを使用すると、構造体の対応する実装にマッチしていない署名で何かを持っていることを検出しました。
最小限の修正が単にfun getbigint
の実装前に、ラインに構造体の定義で
type bigint = int list
を追加することです。これにより、行が許可されます
val j = struct_bigint.getbigint 9;
を動作させることができます。しかし、それは少し愚かな行を持っているように見えるかもしれない
type bigint = int list
2回 - 署名で1回、そして構造内で1回。そして、いくつかの点で、はです。
実装の詳細は実際に署名に属していません。 の署名にはtype bigint
があり、構造のint list
の実装はである方が理にかなっています。これにより、構造体を使用するコードがまったく影響を受けないように、実装について後で(リストではなく配列を使用したいと考えている)実装を変更することができます。ような何か:
signature BIGINT =
sig
type bigint
val getbigint: int -> bigint
end
structure BigInt : BIGINT =
struct
type bigint = int list
fun getbigint (i:int): bigint = [i];
end;
私はそれに結合let
は少し無意味に思えたので、getbigint
の実装をクリーンアップ、および署名(すべて大文字)の名前と構造のためのより多くの慣用的なものを選びました(大手とキャメルケース資本)。
最後に、getbigint 9
はそのまま使用できないことに注意してください。)BigInt.getbigint 9
2)
3現在のスコープ内の名前にgetbigint
その意図した意味を与えるためにラインval getbigint = BigInt.getbigint
を使用して、使用する:明示的に修飾名を使用)
1:あなたは3つのいずれかを行うことができます構造体の定義をトップレベルに移動するにはopen BigInt
行、その後はgetbigint 9
が期待通りに機能します。
私がSMLでプログラミングを始めたとき、たくさんの構造体を開いていました(Char
、 `Listなど)。これを無意識に行うと、遅かれ早かれ、構造を開いて名前の衝突を引き起こすバグが発生します。そのため、私はほぼ常にアプローチ1)または2)を使用します。