2

私は Unquote を使用していますが、おおよその補償は見られませんでした。というわけで一筆書くことにしました。

let inline (=~=) x y = abs x-y <  1.E-10

ただし、演​​算子はリストなどにマップされていません

let test  = [1;2] =~= [1;2]  //---> error

この演算子を次のように宣言することは可能(=)ですか?

それとも、「StructuralEquality-ishness」のような新しい特性を定義する必要がありますか?

たとえば、http://code.google.com/p/fsharp-typeclasses/で新しい演算子を定義する方が良いでしょうか?

4

2 に答える 2

5

Unquoteはわかりませんが、おおよその関数/演算子に関しては、構造比較で実装する方法があるかどうかわかりません。

F# Typeclasses プロジェクトで使用されているものと同様の手法 (またはトリック) を使用して、「手動で」実行する場合は、次の例を参照してください。

type Approximate = Approximate with
    static member inline ($) (Approximate, x:^n       ) = fun (y:^n) -> float (abs (x-y)) <  1.E-10
    static member inline ($) (Approximate, x:list< ^n>) = 
        fun (y:list< ^n>) -> 
            x.Length = y.Length && (List.zip x y |> List.forall ( fun (a,b) -> (Approximate $ a) b))
// More overloads
let inline (=~=) x y = (Approximate $ x) y
于 2012-07-02T17:41:24.373 に答える
3

(私は Unquote を使用していないので、これは当てはまらないかもしれません。)

関数の署名を見てください

'a -> 'b -> bool (requires member ( - ) and member Abs)

Listこれらの演算子のいずれもサポートしていません。はい、あなたの関数は一般的ですが、制約によりリストでの使用が妨げられています。

(=)一方、 には制約がないため、どの型でも使用できます。関数を書き直して制約を取り除くことができる場合は、同様に使用できます (ただし、-andの使用を考慮すると、それがどのように可能になるかabsわかりません。これらの演算子で a がどのように動作すると予想しますlistか?)。

于 2012-07-02T17:14:27.097 に答える