2012-07-02 42 views
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/

+0

是的,但你不能編輯列表類型 - 它已被定義。如果類型是一個列表,你可以檢查(使用':?'),如果是的話,使用你自己的定義 - 但F#中沒有類型類。 –

回答

5

我不知道Unquote,但關於近似函數/運算符我不確定是否有方法通過結構比較來實現它。

如果你想這樣做「手動」,使用的技術(或特技)類似用於F#類型類項目之一,這裏有一個例子:

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 
+0

非常好。對於我的薰陶,你的圖書館是否包含已經或多或少適合這一點的部分? – nicolas

+0

該項目只是一個Demo項目。目標是展示技術,而不是在生產中使用它(儘管我沒有看到任何問題)。你不需要鏈接它就可以實現這一點,在那裏定義的Typeclasses都不會幫助你解決這個問題,但是如果你對這個技術感興趣的話,這是一個很好的參考。 – Gustavo

3

(我沒有使用引文結束這樣這可能不適用。)

在你的函數

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

List母鹿的簽名看看不支持這兩家運營商。是的,你的函數是通用的,但是這些約束不能用於列表。

(=)另一方面,沒有限制,這意味着它可以用於任何類型。如果你的函數可以被重寫以消除約束,那麼它可以被類似地使用(但我不明白考慮到使用-abs--你認爲list如何與這些運算符一起工作,這怎麼可能?)。

+0

=有限制:平等 – nicolas

+0

我不希望這個操作符按原樣工作,而是它的一個修改版本。問題是如何以最通用的方式解除這個操作符。列表中產生的運算符將要求其元素滿足您提到的約束條件,並生成將原始運算符應用於這兩個列表中的每個元素所產生的結果列表,例如 – nicolas

+0

@nicolas:好點,但平等是一個相當薄弱的約束,考慮每種類型,但用'[]'裝飾的'滿足它。 – Daniel