Julia の文字列結合演算が積 (*) である理由(他言語との比較)
+
という記号は経験的に交換則が成り立つことを期待するものであるのに対して、文字列結合は交換則が成り立たたないからというのがその理由である。
"Hello, " * "World." != "World." * "Hello, "
ただしIssue #1771の議論を見れば分かるように、*
を良い演算子と思っている人はあまりいないようだ。本質的に文字列結合演算は IO Buffer を介さない非効率的なものであって、パフォーマンスに敏感な場面では適さない(煎じ詰めると「これって要らない子なのでは?」)というのが論点のようだ。
以下文字列の性質に関して Issue #1771 を読みながらノート。
- Karpinski も言及しているように、Haskell では文字列結合演算は
++
として表現されている。これも代数的な見地からして+
を使うのは好ましくないからということである - 文字列の結合演算はモノイドである
- Haskell では Monoid クラスの実装として
<>
という記号を使っている - ここで Karpinski への反論として言われているように モノイド演算には正統(canonical)な表現があるわけではない。例えば、Haskeller にも次のように Monoid を定義する人はいた
class Monoid a where zero :: a (+) :: a -> a -> a instance Monoid [a] where zero = [] (+) = (++)
これは分かりやすさの便宜上(この記事では半環を扱っているのでモノイド演算との差を際立たせている)こうしているのであって、なんでもかんでも +
をオーバロードするのはやっぱおかしいと言われればその通りですが。
- このコメントで Rust と Dart の状況が紹介されている。
- まず Rust 。
+
を++
にリプレースする提案が ML に投げられたが、十分な関心を得られていないようだ - 次に Dart 。文字列結合演算子そのものを廃止して、次のような挿入記法か
StringBuffer
を使えと述べている
var to = 'Dart developer'; var msg = 'Hello $to!'; assert(msg == 'Hello Dart developer!')