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