中置演算子のインライン化
中置演算子は基本的にインライン化されるみたい。例えば+演算子はelm/coreの定義では code:elm
var _Basics_add = F2(function(a, b) { return a + b; });
となっているけど、2 + 3と書いたらJSでもそのまま2 + 3になる。
じゃあなんで関数の形で定義しているのかと言えば部分適用したいからでしょう。
code:elm
addOne =
(+) 1
と部分適用したときは
code:js
var $author$project$Main$addOne = $elm$core$Basics$add(1);
というように関数適用の形で呼ばれる。
みんな大好き|>演算子もインライン化される。
code:elm
main : Html.Html msg
main =
text <| String.fromInt <| (+) 1 <| 2
は
code:js
var $author$project$Main$main = $elm$html$Html$text(
$elm$core$String$fromInt(1 + 2));
となるのでノーコスト。いくらでも使って構わない。
ただ<<は定義元のcomposeLが呼ばれてしまうようなので注意。
code:elm
textInt =
text << String.fromInt
code:js
var $author$project$Main$textInt = A2($elm$core$Basics$composeL, $elm$html$Html$text, $elm$core$String$fromInt);
これをインライン化するなら引数の数を気にしないといけないけど、
code:elm
composeL : (b -> c) -> (a -> b) -> (a -> c)
composeL g f x =
g (f x)
多相関数なので引数の数を引き回していないので難しいのかな。まあインライン化しても関数宣言してFで包む必要があるからファイルサイズが増えるだけでパフォーマンスは変わらないかもっと悪いかも知れない。