Julia の文字列結合演算が積 (*) である理由(他言語との比較)

Why is string concatenation done with * not + - Google グループ

+ という記号は経験的に交換則が成り立つことを期待するものであるのに対して、文字列結合は交換則が成り立たたないからというのがその理由である。

"Hello, " * "World." != "World." * "Hello, "

ただしIssue #1771の議論を見れば分かるように、* を良い演算子と思っている人はあまりいないようだ。本質的に文字列結合演算は IO Buffer を介さない非効率的なものであって、パフォーマンスに敏感な場面では適さない(煎じ詰めると「これって要らない子なのでは?」)というのが論点のようだ。

以下文字列の性質に関して Issue #1771 を読みながらノート。

class Monoid a where
  zero :: a
  (+) :: a -> a -> a

instance Monoid [a] where
  zero = []
  (+) = (++)

これは分かりやすさの便宜上(この記事では半環を扱っているのでモノイド演算との差を際立たせている)こうしているのであって、なんでもかんでも + をオーバロードするのはやっぱおかしいと言われればその通りですが。

var to = 'Dart developer';
var msg = 'Hello $to!';
assert(msg == 'Hello Dart developer!')
  • 演算そのものを廃止するというのはなかなか過激な選択に思えるが、Dart はその理由を 3 つ挙げている
    • puzzler を生む原因となる
    • 文字列挿入のほうを推奨すべきなのに存在感が過大
    • 本質的に非効率 (O(n2))なコードを書いてしまう
  • Jeff Bezanson 「Lisper なら string(a, b, c, ...) が一番読みやすいかな!」