2

我正在使用 Unquote 并没有看到任何近似的比较。所以我决定写一个。

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

然而,运营商没有被映射到,比如 Lists

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——您希望 alist如何与这些运算符一起表现?)。

于 2012-07-02T17:14:27.097 回答