2016-03-22 17 views
1

構造体の外側で使用するために構造体a内の中置演算子を宣言したいと思います。しかし、私は、構造が開かれたときでさえ、構造の外側で認識されるような "インフィックス"を得ることはできません。標準MLエクスポート演算子を構造体から中置

> structure A = struct infix 6 ++ fun a ++ b = a + b end; 
structure A: sig val ++: int * int -> int end 
> 1 A.++ 2; 
poly: : error: Type error in function application. 
    Function: 1 : int 
    Argument: A.++ : int * int -> int 
    Reason: Value being applied does not have a function type 
Found near 1 A.++ 2 
Static Errors 
> let open A in 1 ++ 2 end; 
poly: : error: Type error in function application. 
    Function: 1 : int 
    Argument: ++ : int * int -> int 
    Reason: Value being applied does not have a function type 
Found near let open A in 1 ++ 2 end 
Static Errors 

これは、標準MLの制限ですか。これはPoly/MLを使用した例です。

答えて

1

はい、標準MLではサポートされていません。 openその構造のたびに、修正と、必要に応じて優先順位を再宣言する必要があります。これを回避する方法の1つは、グローバルに、つまり構造体の外部に固定を宣言することですが、これは個別のコンパイルでは十分サポートされておらず、それほどモジュール化されていません。 MLton's InfixingOperators pageで、その問題と回避策の詳細を読むことができます。

私自身のプロジェクトでは、テキストエディタでopen宣言とフィフティリティの両方に展開するショートカットを定義しました。

また、個人的なスタイルのガイドとして、私は優先順位を宣言していません。複数の中置演算子を同じ式に混ぜる必要がある場合は、かっこを明示的に使用します。インフィックスとしてのアイ・パーシングは簡単で、優先順位の解析は容易ではありません。

+0

素晴らしい提案、ありがとうございます。 – eatonphil

関連する問題