top page > computer > haskell > web_lecture > for_programmer > infix.html
更新日:
文責: 重城良国

構文: infix

(工事中 70%)

結合力

infix.hs

Haskellでは演算子が自分で定義できる。それだけではなく0から9までで演算子の結合力を指定できる。また同一の結合力の場合に結合性を指定するために「左」「右」「無」の3名りの結合性を指定できる。

演算子の定義

結合力

(.+.), (.*.) :: Int -> Int -> Int
(.+.) = (+)
(.*.) = (*)

% ghci infix.hs
*Main> 3 .+. 5 .*. 8
64

デフォルトでは左結合で結合力は9となる。(.+.)の結合力を下げてみよう。以下を追加する。

infixl 6 .+.

*Main> :reload
*Main> 3 .+. 5 .*. 8
43

結合性

(.-.) :: Int -> Int -> Int
(.-.) = (-)

infix構文では複数の演算子を指定できる。

infixl 6 .+., .-.

*Main> :reload
*Main> 10 .-. 5 .-. 3
2

次は右結合を試してみよう。infixlをinfixrにしてみる。

infixr 6 .+., .-.

*Main> :reload
*Main> 10 .-. 5 .-. 3
8

無結合ではどうなるだろうか。infixrをinfixにする。

infix 6 .+., .-.

*Main> :reload
*Main> 10 .-. 5 .-. 3

<interactive>:X:1:
Precedence parsing error
cannot mix `.-.' [infix 6] and ...

無結合の場合同じ結合力の演算子がとなりあっているとエラーとなる。明示的に括弧でくくってやる必要がある。

値構築演算子

値構築演算子についても結合力を指定できる。

data A = B :+: B deriving Show

data B = Int :*: Int deriving Show

infixl 6 :+:
infixl 7 :*:

*Main> :reload
*Main> 3 :*: 5 :+: 7:*: 10
3 :*: 5 :+: 7:*: 10

まとめ

自分で定義した演算子や値構築演算子に結合力や結合性を指定できる。

「型クラス: Ord」へもどる 「アルゴリズム: 差分リスト」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics