基於:Is possible to define same-named operator for different argument count?如何聲明全局級可重載操作符?
我要定義一些運營商像+
但讓來電-|-
例如有
let a = -|- 1
let b = 1 -|- 1
let c = 1 -|- 1 1 1 1
至少2第一行會爲+
工作,但我怎麼能宣佈自己的操作員像這個?
基於:Is possible to define same-named operator for different argument count?如何聲明全局級可重載操作符?
我要定義一些運營商像+
但讓來電-|-
例如有
let a = -|- 1
let b = 1 -|- 1
let c = 1 -|- 1 1 1 1
至少2第一行會爲+
工作,但我怎麼能宣佈自己的操作員像這個?
我不認爲有一個簡單的方法來做到這一點一般來說。您可能可以使用一個inline
運營商與靜態成員約束的組合,以涵蓋一些您想要的情況下,但我不認爲它會非常優雅。
對於一些運營商的名稱,但是,您可以定義一個單獨的前綴和綴版本,它涵蓋了前兩種情況:
// Prefix version of the operator (when you write e.g. '+. 10')
let (~+.) a = a * 10
// Infix version of the operator (when you write e.g. '1 +. 10')
let (+.) a b = a + b
// Sample use
+. 10
10 +. 20
你仍然不能寫10 +. 20 30 40
,因爲那麼你需要一個超載的中綴操作符。
值得注意的是,您無法爲所有操作員名稱執行此操作。這裏是從允許的操作者名的F# specification一個語法定義爲中綴運算符:
綴或前綴運算:=
+, - ,+, - ,%,& ,& &前綴-OP:=
綴或前綴運算
! ~~ ~~~(〜和任何重複)
OP(!=除外)
PS:我不是一般運營商定製的忠實粉絲 - 在某些情況下,他們很好,但很難發現(你在IntelliSense中看不到它們),除非你使用標準的數值計算,否則很難理解它們的含義。所以我可能會考慮其他的方法...
那麼,關於可識別聯合:
type RHS =
|One of int
|Two of int * int
...
然後
let (-|-) a b =
match b with
|One(a) -> ...
|Two(a,b) -> ...
...
與調用它:
1 -|- One(1)
1 -|- Two(1,1)
....
謝謝你的建議,但它不是我想要得到的相同水平。我不喜歡'let a = 1 - | - Zero()'我想要' - | - 1'的外觀。所以也許這是不可能的,我只是有興趣,如果這可能。 – Cynede 2013-02-18 06:58:43
哇!說實話,這通常是我想達到的。謝謝。 – Cynede 2013-02-18 07:05:33
我只是在看你以前的問題,我認爲是這樣...... :-)。我添加了允許的運營商名稱列表。 – 2013-02-18 07:10:45
但我不能使用一些,我不能使用'let inline(〜^)' – Cynede 2013-02-18 07:10:52