簡體   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