So-net無料ブログ作成

Swift5の数関連プロトコル [Swiftプログラミング]

いつのまにかSwift 5になってた。勉強途中なので追いかけるのが大変。基本的なprotocolに変更があった。詳しくレポートしてくれる人がいた。

数関連のprotocolが代数構造に似ていると思っていたけど、AdditiveArithmeticはいかにも.zeroを単位元とする加法群という感じになっている。ただし逆元があるかどうかや、結合則に従うか、可換性を持つかどうかは実装に依存する形になってるので、Loopかモノイドかそれともアーベル群なのかは具体的な型の実装に任されている。まあ、そこまで代数をモデル化してもプログラミングの役に立たなかったら意味がないので当然だろう。

その結果というかNumeric protocolは積の演算だけが定義されるprotocolになった。Numericには積の単位元である.oneは定義されていないので、Numericは乗法に関して単位元のない半群を持つのような感じになってる。比較的身近な環にクォータニオンがある(正確には整域なのか)。また$n \times n$正方行列全体も環をなす。どちらも乗法に関して非可換な環である。また、この人が指摘してるように$n$次元のベクトルは加法群をなす。

ところがなぜかこないだちょっと見たsimdライブラリではベクトルもクォータニオンも行列もこれらのprotocolをadoptしていない。演算子定義なんかはそれぞれ勝手にやってる。大した手間ではないとは言えるんだけど、せっかくprotocolを整理したのに一方では無視すると言うのは美しくない。simdライブラリがCではなくSwiftに書き換えられた時点でちゃんとするのかもしれない(simdライブラリなんか、やろうと思えばあっという間だと思うんだけど。SwiftはOjbetictive-CよりCのほうが相性がいいのではないか、と最近は感じるようになった)。

ついでに言えば、simdライブラリにクォータニオンがあって同次座標のベクトルと行列の定義はないのもちょっと残念。同次座標ベクトル \begin{equation} \left( \begin{array}{c} x \\ y \\ z \\ w \end{array} \right) \equiv \left( \begin{array}{c} x / w \\ y / w \\ z / w \\ 1 \end{array} \right) \end{equation} の同値関係をEquatable protocolにadoptした形にすれば美しいのに。まあそれがどのくらい便利か、はなんとも言えないけど。

Swift 5での数関連protocolの継承関係をMathematicaでgraphにしなおすと、
0601numbers.png

となる。今回はprotocolだけにした。グレーのprotocolは数ではなく文字列からの変換を表すprotocolである。

MathematicaのGraphLayoutはいろいろできるんだけど、見やすい形にするのは難しい。結局これもIllustratorで細工した。あまり意味ない。
nice!(0)  コメント(0)