3

コードの一部に型定義を追加することにし、Typer を実行して開始点を取得しました (erlang 15b02、typer 0.9.4)。

すべてが問題ないかどうかを確認するためにいくつかの結果を選択しましたが、理解できない次の結果が見つかりました。

par(true, o) -> "(";
par(true, f) -> ")";
par(_, _) -> "".

仕様を生成します:

-spec par(boolean(),'f' | 'o') -> [40 | 41].

この関数はエクスポートされていないため、入力パラメーターを理解できます。私のコードは、最初のパラメーターとしてブール式を使用して関数を呼び出し、アトム o または f を 2 番目のパラメーターとして呼び出すだけです (たとえばpar(4 > P, o))。

しかし、なぜ戻りリストに空のリストが含まれないのでしょうか? [40 | 41 | []]私は次のようなものを期待していました[40 | 41 | ""]

このコードは数式を出力するために使用され、優先度または演算子が十分な場合は括弧を避けます。たとえば、印刷

3 + 4 + 5 * (6 + 7) - sin( x + 7) それよりも

3 + ( 4 + (( 5 * ( 6 + 7 )) - sin(( x + 7)))).

テスト カバレッジの結果が示すように、最初のパラメーターとして false を指定してコードが呼び出されていることは確かです。

    15..|  par(true, o) -> "(";
    15..|  par(true, f) -> ")";
   308..|  par(_, _) -> "".
4

1 に答える 1

6

Erlangの型仕様として、は「型[X]の 0 個以上の要素のリスト」を意味しますX。あなたの場合、Xis 40 | 41、 so "("")""()()"および""すべてがこのタイプに一致します。厳密に 1 つの要素のリストを型仕様として表現する方法はありません。

少なくとも 1 つの要素を含むリストは、として指定できます[X,...]。typer が[40 | 41]代わりに言うという事実[40 | 41,...]は、関数が空のリストを返すことができることを知っていることを意味します。

于 2013-07-22T11:53:32.267 に答える