演算子の優先順位

演算子の優先順位 F#2.0版
	参考
		The F# 2.0 Language Specification April 2010(candidate)
			4.4.2 Precedence of Symbolic Operators
			      and Pattern/Expression Constructs

	右側に書いてあるのは演算子の結合の仕方
		%right    右結合
		%left     左結合
		%nonassoc 無結合
	下に行くほど優先順位が上がる
	as                          %right
	when                        %right
	|                           %left
	;                           %right
	let                         %nonassoc
	function, fun, match, try   %nonassoc
	if                          %nonassoc
	->                          %right
	:=                          %right
	,                           %nonassoc
	or ||                       %left
	& &&                        %left
	:> :?>                      %right
	!=OP <OP >OP = |OP &OP $    %left
	^OP                         %right
	::                          %right
	:?                          %nonassoc
	-OP +OP                     %left -- for infix uses of these symbols
	*OP /OP %OP                 %left
	**OP                        %right
	"f x" "lazy x" "assert x"   %left
	"| rule"                    %right -- パターンマッチルール
	prefix-op                   %left -- for prefix uses of these symbols
	.                           %left
	f(x)                        %left -- 関数適用
	f<types>                    %left -- 型適用
この図で先頭に"記号OP"とある変数については 自分で変数定義した際の優先順位と結合性を表します (演算子の最初1文字で勝手に決まります) 例えば<OPと^OP、つまり <から始まる演算子(次の例では<<@)と ^から始まる演算子(次の例では^^@は 結合性が異なります。 結合法則の成り立たない冪を使えば
ユーザ定義の演算子の結合性
let ( <<@ ) x y = x ** y;; //x ** y はxのy乗
let ( ^^@ ) x y = x ** y;;
実行結果
> 3. <<@ 3. <<@ 3.;; //((3. <<@ 3.) <<@ 3.)が実行された
	val it : float = 19683.0
> 3. ^^@ 3. ^^@ 3.;; //(3. ^^@ (3. ^^@ 3.))が実行された
	val it : float = 7.625597485e+12
このように違いがわかります。優先順位に関しても同様です。 また、.と$だけは特殊で、演算子の優先順位は2文字目以降のもので決まります 例 .^と^^は同じ優先順位を持つ ユーザ定義出来るシンボルの種類は 予約されているシンボルキーワードを除き 次のものに制限されています
ユーザ定義出来るシンボルの種類 F#2.0版
		The F# 2.0 Language Specification April 2010(candidate)
			3.6 Symbolic Keywords
			3.7 Symbolic Operators

User-defined and library-defined symbolic operators are sequences of characters as shown below, except where the sequence of characters is a symbolic keyword

regexp first-op-char = !%&*+-./<=>@^|‾
regexp op-char = first-op-char | ?
token quote-op-left =
	| <@ <@@
token quote-op-right =
	| @> @@>
token symbolic-op =
	| ?
	| ?<-
	| first-op-char op-char*
	| quote-op-left
	| quote-op-right

token symbolic-keyword =
	let! use! do! yield! return!
	| -> <- . : ( ) [ ] [< >] [| |] { }
	' # :?> :? :> .. :: := ;; ; =
	_ ? ?? (*) <@ @> <@@ @@>

token reserved-symbolic-sequence =
	‾ `
参考リンク:OCamlの演算子の優先順位ルール