LoginSignup
6
2

More than 3 years have passed since last update.

PureScript の演算子って? 優先度は? 結合規則はあるの? 調べてみました!

Last updated at Posted at 2020-06-24

みなさんこんにちは! Qiita ユーザーの青井ひかりです!

JavaScript エンジン上で動作する純粋函数型スクリプト言語の PureScript はご存知でしょうか? あの Haskell に影響を受けて設計された言語で, 表現力豊かな型システムと実行時エラーが発生しづらい高い安全性が特徴です!

ところで, プログラミングには演算子がつきものです! だけど, 初めての言語でよくわからない, という人も多いのではないでしょうか?

今回はそんな PureScript の演算子について調べてみました!

JavaScript の演算子との対応表

それでは, JavaScript と PureScript の演算子がどのように対応しているのかを見ていきましょう!

JavaScript 表記 JavaScript 特性 PureScript 表記 PureScript 特性 パッケージ モジュール
冪乗 ** L15 - - - -
乗法 * L14 * L7 purescript-prelude Data.Semiring
除法 / L14 / L7 purescript-prelude Data.EuclideanRing
剰余 % L14 % L7 purescript-math Math
加法 + L13 + L6 purescript-prelude Data.Semiring
減法 - L13 - L6 purescript-prelude Data.Ring
結合 + L13 <> R5 purescript-prelude Data.Semigroup
左転移 << L12 - - - -
右転移 >> L12 - - - -
未満 < L11 < L4 purescript-prelude Data.Ord
以下 <= L11 <= L4 purescript-prelude Data.Ord
> L11 > L4 purescript-prelude Data.Ord
以上 >= L11 >= L4 purescript-prelude Data.Ord
等価 == L10 == N4 purescript-prelude Data.Eq
不等価 != L10 /= N4 purescript-prelude Data.Eq
交叉 & L9 .&. L10 purescript-integers Data.Int.Bits
対称差 ^ L8 .^. L10 purescript-integers Data.Int.Bits
合併 | L7 .|. L10 purescript-integers Data.Int.Bits
連言 && L6 && R3 purescript-prelude Data.HeytingAlgebra
選言 || L5 || R2 purescript-prelude Data.HeytingAlgebra

一部存在しない演算子がある!

表を見てもらうと分かる通り, べき乗とシフトは演算子が用意されていません!

ただし, べき乗はInt型に対する函数として purescript-integers パッケージのData.Intモジュールに, Number型に対する函数として purescript-math パッケージのMathモジュールにpow函数が, シフトはInt型に対する函数として purescript-integers パッケージのData.Int.Bitsモジュールにshl函数とshr函数が, それぞれ定義されています!

PureScript は自由に演算子を定義できる言語なので, 必要そうなら自分で定義して使ってもいいかもしれませんね!

“あまり” の計算に注意!

“あまり” の計算については JavaScript の演算子と同じく%演算子が用意されています。

ただし, この演算子はNumber型に対して単相的に定義されています! つまり, Int型に対して%演算子を使用することはできません!

かわりに, EuclideanRing型クラスのインスタンスをもつ型はmod函数を使うことができます! Int型の “あまり” を計算するときはこちらを使用しましょう!

ところで, Numberもユークリッド環ですが, mod函数を使うとどうなるのでしょうか? 実は, Number型に対してmod函数を使用すると, ほとんどの場合0.0が返ってきます! これはユークリッド除算の性質によるもので, Numberは常に “割り切れる” ためなのです! %演算子は JavaScript の%演算子と同じ感覚で使えるので便利ですね!

文字列の結合は<>で!

JavaScript では数値の足し算も文字列の結合も同じ+演算子を使っていますが, PureScript では文字列の結合には<>演算子を使います!

JavaScript の感覚で+演算子を使おうとすると “文字列は半環ではありませんよ” という意味のビルドエラーが発生しますので注意しましょう!

“等しくない” は数学風!

JavaScript では “等しくない” ことを表すのに!=演算子を使いますが, PureScript では同じ意味の演算子は/=演算子になっています!

数学記号の $\ne$ をイメージしたデザインで分かりやすいですね!

ビット演算子はドットで挟もう!

合併, 交叉, 対称差といった Bitwise 演算を行う演算子は, PureScript ではドット (ピリオド) で挟まれています! おそらく 1 文字のパイプ (|) が PureScript では重要な意味を持つため, かぶらないようにしたのだと思います。

ところで, .^.って顔文字みたいでかわいいですね! 🙃

結合規則に注意!

今回挙げた演算子は, JavaScript ではすべて左結合ですが, PureScript では右結合や無結合 (結合しない, 並べて書けないということ) のものも多くあります!

右結合とされる演算子の多くは結合規則を満たしているためあまり気にしなくてもよいかもしれませんが, 頭の片隅に入れておいてくださいね!

優先度の違いに注意!

JavaScript と PureScript では, 演算子の優先度の並びが異なることがあります!

たとえば, 文字列の結合を行う<>演算子は足し算や引き算よりも優先度が低く設定されています! また, Bitwise 演算は PureScript では優先度が非常に高く, .&.演算子, .|.演算子, .^.演算子の間で優先度の違いがありません!

これらの違いはしっかり覚えておきましょう!

PureScript の主要な演算子, 一挙公開!

PureScript でよく用いられるそのほかの演算子も加えたうえで, 優先度にしたがって並べたのが以下の表になります!

表記 特性 パッケージ モジュール
合併 .|. L10 purescript-integers Data.Int.Bits
交叉 .&. L10 purescript-integers Data.Int.Bits
対称差 .^. L10 purescript-integers Data.Int.Bits
合成 <<< R9 purescript-prelude Control.Semigroupoid
逆合成 >>> R9 purescript-prelude Control.Semigroupoid
乗法 * L7 purescript-prelude Data.Semiring
除法 / L7 purescript-prelude Data.EuclideanRing
剰余 % L7 purescript-math Math
加法 + L6 purescript-prelude Data.Semiring
減法 - L6 purescript-prelude Data.Ring
結合 <> R5 purescript-prelude Data.Semigroup
等価 == N4 purescript-prelude Data.Eq
不等価 /= N4 purescript-prelude Data.Eq
未満 < L4 purescript-prelude Data.Ord
以下 <= L4 purescript-prelude Data.Ord
> L4 purescript-prelude Data.Ord
以上 >= L4 purescript-prelude Data.Ord
写像 <$> L4 purescript-prelude Data.Functor
闕右 <$ L4 purescript-prelude Data.Functor
闕左 $> L4 purescript-prelude Data.Functor
適用 <*> L4 purescript-prelude Control.Apply
適用一次 <* L4 purescript-prelude Control.Apply
適用二次 *> L4 purescript-prelude Control.Apply
連言 && R3 purescript-prelude Data.HeytingAlgebra
選言 || R2 purescript-prelude Data.HeytingAlgebra
逆写像 <#> L1 purescript-prelude Data.Functor
逆函数適用 # L1 purescript-prelude Data.Function
束縛 >>= L1 purescript-prelude Control.Bind
逆束縛 =<< R1 purescript-prelude Control.Bind
クライスリ合成 >=> R1 purescript-prelude Control.Bind
逆クライスリ合成 <=< R1 purescript-prelude Control.Bind
函数適用 $ R0 purescript-prelude Data.Function

見慣れない演算子も多くありますが, そういうところが PureScript の楽しいところです! はよう>>=まみれになろうや。 a -> m b,溜めて待つぜ。

まとめ

いかがでしたか?

調べてみましたが, PureScript には言語組み込みの演算子がないためよくわかりませんでした。

しかし, PureScript には演算子を定義する機構が存在しており, よく使われるものに関しては purescript-prelude というパッケージで定義されています。

そのほか, 公開されているパッケージにどのような函数や演算子が定義されているかは専用の検索エンジン Pursuit で検索することができます! 今後もわからない演算子があったら調べていこうと思います!

ここまで読んでいただきありがとうございました! よかったら下か左にある LGTM ボタンを押してくださいね!

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2