2013-05-14 27 views
10

記号を使用しない中置関数を書く方法はありますか?このようなもの:中置関数を書く方法

let mod x y = x % y 
x mod y 

「mod」などの前のキーワードかもしれません。

+0

[このユーザーボイスの問題](http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2313479-provide-the-option-of-having-infix-notation-楽しんで)。 – Daniel

+0

http://stackoverflow.com/questions/2210854/can-you-define-your-own-operators-in-f – ony

答えて

16

既存の答えは正しいです。F#(中置演算子のみ)で中置関数を定義することはできません。そうでない場合、コンパイラは数値リテラル(等10.0f)として10.mを解釈しようとするため、.の前にスペースが必要であること

// Define an extension member 'modulo' that 
// can be called on any Int32 value 
type System.Int32 with 
    member x.modulo n = x % n 

// To use it, you can write something like this: 
10 .modulo 3 

注:別にパイプ事業者とトリックから、あなたはまた、延長部材を使用することができます。

F#は機能スタイルとオブジェクト指向スタイルの両方をサポートしているため、パイプライントリックを使用するよりも少しエレガントです。拡張スタイルメソッドは、ある意味では、機能スタイルから暗黙の演算子に近いです。パイプラインのトリックは、演算子のわずかな誤用のように見えます(最初は混乱するように見えるかもしれませんが、おそらくメソッド呼び出しよりも混乱するかもしれません)。

// Define custom operators to make the syntax prettier 
let (</) a b = a |> b 
let (/>) a b = a <| b  
let modulo a b = a % b 

// Then you can turn any function into infix using: 
10 </modulo/> 3 

しかし、たとえ:おそらく最も興味深いのバージョンでは、このいずれか(また、あなたがオペレータの前後にスペースを省略することができるという事実を利用している)である - 私は代わりにパイプラインの他の演算子を使っている人を見ている、と述べた

これはF#の世界で確立されたイディオムではないので、私はおそらく拡張メンバーを好みます。

+1

私は何かを書いている/コードしているので、しばらくしていますが、これはC#の拡張メソッドと同じことを実現するようです。甘い! – Iter

+2

@Iter This ** **拡張メソッドです:) –

+2

この古い投稿には申し訳ありませんが、演算子のペアが間違っています:演算子の優先順位のため、 '10 3 'は' modulo 3 10'と同等です。 'モジュロ10 3 '。 1つの解決策は代わりに 'let(/>)f x y = f y x'を定義することです。あるいは、「<.' and '.>」のように、優先順位の高い別の演算子を使用することもできます。 – Tarmil

6

わかりませんが、左右のパイプ演算子を使用できます。たとえば、

let modulo x y = x % y 

let FourMod3 = 4 |> modulo <| 3 
+0

上記は「擬似挿入」と見なされます 何も間違っていて、間違っていませんそれは時々、この記法が好きです。 – BoomTownTech

関連する問題