演算子このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。 last mod. 2008-04-07 (月) 17:13:39
OCaml演算子を定義する場合は、カッコで囲む必要があります。 ただし、演算子の名前は全て記号だけからなる必要があります。 なお、組み込み演算子のland,lor,modなどは特別扱いされています。 # let (+:) x y = x * 2 + y;; val ( +: ) : int -> int -> int = <fun> # 3 +: 2;; - : int = 8 演算子をカッコで囲むと、関数として用いることができます。 # (+);; - : int -> int -> int = <fun> # (+) 1 2;; - : int = 3 中置演算子か前置演算子か、またその結合規則や優先度は先頭の記号によって決まります。 例えば上の +: のような + で始まる演算子は全て + と同じ強さの左結合演算子となります。 なお(* ~ *) がコメントなので、 * 演算子を指定するときは注意が必要になります。 # ( * );; - : int -> int -> int = <fun> # (*);; Warning: this is the start of a comment. SML演算子を定義するには、宣言時にopを指定し、infixによって優先度を指定します。 OCamlやHaskellと異なり、演算子にできる識別子に制限はありません。 - fun op +: (x,y) = x * 2 + y; val +: = fn : int * int -> int - infix 6 +:; infix 6 +: - 3 +: 2; val it = 8 : int op を前置することで、演算子を関数として用いることができます。 - op+; val it = fn : int * int -> int - op+ 1 2 val it = 3 : int infix (左結合), infixr (右結合) 宣言を用いて、結合の強さと方向を指定することができます。 - infix 6 ++; infix 6 ++ - infixr 7 qplus; infixr 7 qplus なお、 SML では - は中置演算子として定義されているため、前置できません。 マイナス1は ~1 と表記することになる。 また、演算子はタプルを受け取るので、部分適用するには fn x => ... のように書く必要があります。 Haskell演算子を定義する場合は、中値演算子の位置に識別子を宣言する必要があります。 ただし、演算子の名前は全て記号だけからなる必要があります。 (++) :: [a] -> [a] -> [a] [] ++ ys = ys (x:xs) ++ ys = x : (xs++ys) 演算子をカッコで囲むと、関数として用いることができます。また、任意の関数をバッククォートで括ることで、中置演算子のように用いることができます。 Main> (+) 1 2 3 Main> 4 `div` 2 2 infixl (左結合), infixr (右結合) 宣言を用いて、結合の強さと方向を指定することができます。 infixl 5 ++ また、以下のようにすることで演算子の部分適用ができます。 (x+) = \y -> x+y (+y) = \x -> x+y |