繁体   English   中英

通用F#运算符很有趣

[英]Generic F# operators fun

此问题遵循此处发布的想法: F#中的通用单位

我开始怀疑是否可以定义一个通用运算符,以类似的方式接受两个参数,就像我链接的文章中介绍的那样?

例如:我一直在尝试实现一个“ AlmostEqual”运算符(=〜),该运算符可与Floats和我自己的类型(称为“ VectorDirection”)一起使用。 按照这个想法,我创建了以下代码:

type AlmostEqual = AlmostEqual with
    static member ($) (AlmostEqual, (a,b) : float * float) = a >= b - Math.tol && a <= b + Math.tol    
    static member ($) (AlmostEqual, (vd1, vd2)) =
                        // my logic goes here - irrelevant for the general idea presented here

let inline (=~) x = AlmostEqual $ x

可以,但是有血清限制,但是可以用以下方式使用:

(=~) (arg1, arg2)

这意味着更自然的使用方式:

arg1 =~ arg2  // wrong: (=~) complains it's in a wrong place and arg2 is not a tuple

不被允许。 我了解局限性,但是我真的找不到解决它的方法。

let inline (=~) (x,y) = ...

是一个以元组为参数的函数,

let inline (=~) x y = ...

是一个函数,需要两个参数。 如果要将函数用作中缀函数,则需要使用两个参数。

如另一个答案中所述,问题是元组与咖喱参数,通过这样定义函数将解决主要问题:

let inline (=~) x y = AlmostEqual $ (x, y)

无论如何,我还是建议您更改成员定义,因为您可能会通过关联多态参数而在重载解析方面遇到问题。 如果遇到这些问题,请尝试以下操作:

type AlmostEqual = AlmostEqual with
    static member ($) (AlmostEqual, a: float) = fun (b: float) -> // {your implementation}
    static member ($) (AlmostEqual, vd1     ) = fun vd2        -> // {your implementation}

let inline (=~) x y = (AlmostEqual $ x) y

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM