1
type Parameter =
    | Fixed of double
    | Free of double ref
    with
    override m.ToString() = 
        match m with
        | Fixed v -> sprintf "%f" v
        | Free  v -> sprintf "$%f" v.Value
    static member (~!) m =
        match m with
        | Fixed v -> v
        | Free v -> !v

The operator I try to define ~! causes the error but according to http://msdn.microsoft.com/en-us/library/dd233204%28VS.100%29.aspx ! is a valid prefix operator.

(~+) works ok

The specific error is

    Error FS1208: Invalid operator definition. 
    Prefix operator definitions must use a valid prefix operator name. 
    (FS1208) (SketchSolveFS)
4

1 に答える 1

1

(!)常に有効な前置演算子で~あるため、チルダ ( ) を使用して前置演算子として指定する必要はありません。

残念ながら、あなたのコードにその変更を加えると、新しいエラー メッセージが表示されます。しばらく前 (F# 2.0 の頃だったと思います) 似たようなことを試したところ、F# コンパイラ (2.0 と 3.0 の両方) に、F# 言語仕様に従って有効な特定のプレフィックス演算子が明らかにハードコードされているバグが含まれていることがわかりました。コンパイラ (おそらく型推論またはメンバー リゾルバのいずれか) -- 事実上、それらはオーバーロードできません。IIRC、これは (少なくとも) 、(!)(~&)および(~&&)演算子に影響します。

変更を加えたコードと、使用例 (コンパイラが新しいエラーを出力する場所) を次に示します。

type Parameter =
    | Fixed of double
    | Free of double ref
with
    override m.ToString() = 
        match m with
        | Fixed v -> sprintf "%f" v
        | Free  v -> sprintf "$%f" !v
    static member (!) m =
        match m with
        | Fixed v -> v
        | Free v -> !v

let p = Free (ref System.Math.PI)
let value = !p    // Error is emitted for 'p'

エラーのテキスト:

error FS0001: This expression was expected to have type    'a ref    but here has type    Parameter

(!!)最後に、の代わりに演算子をオーバーロードすることで問題を回避できます(!)

于 2013-06-16T17:06:40.507 に答える