2013-02-18 86 views

回答

5

我不認爲有一個簡單的方法來做到這一點一般來說。您可能可以使用一個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中看不到它們),除非你使用標準的數值計算,否則很難理解它們的含義。所以我可能會考慮其他的方法...

+0

哇!說實話,這通常是我想達到的。謝謝。 – Cynede 2013-02-18 07:05:33

+2

我只是在看你以前的問題,我認爲是這樣...... :-)。我添加了允許的運營商名稱列表。 – 2013-02-18 07:10:45

+0

但我不能使用一些,我不能使用'let inline(〜^)' – Cynede 2013-02-18 07:10:52

1

那麼,關於可識別聯合:

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) 
.... 
+0

謝謝你的建議,但它不是我想要得到的相同水平。我不喜歡'let a = 1 - | - Zero()'我想要' - | - 1'的外觀。所以也許這是不可能的,我只是有興趣,如果這可能。 – Cynede 2013-02-18 06:58:43