演算子

このページは最後に更新されてから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

新規 編集 添付