[英]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.