mulitple dispatchを書いて、効果的なコードを書こうと思ったとき、とまどったこと/整理できたことをすこしだけ書く。
当たり前のことだけれど。
multiple dispatchによる場合わけ
multiple dispatchでコードを書くとき、場合わけの部分を別の定義で書くことができる。
つまり、こういうコード
function myfunc(x::All)
if x isa NUmber; ...n
elseif x isa String; ...t
elseif x isa Symbol; ...y
else ...e
end
end
を、こういうふうに定義できるということ。
function myfunc(x::Number) ...n end
function myfunc(x::String) ...t end
function myfunc(x::Symbol) ...y end
function myfunc(x) ...e end
入力データに対する場合わけの、型による部分はmultiple dispatchでこう書けるというはなし。
Juliaの場合、Union型を作ることができるので、もうすこし型階層を複雑にできる。
昔、よくわかっていないときには、入力の場合わけをすべてこの形で書けるかもしれないという幻想を抱いていたのだけれど、よく考えればそういうことはなく、型による場合わけだけがこの方法で書ける。
同じ型の値についての場合わけは、定義の中に書く必要がある。
つまり、Numberの型の中で、0の場合と正の場合を分けたコードを書きたいときは、myfunc(x::Number)の定義の中で場合わけが必要ということ。
{0}とか{x|x>0}とかいう型が定義できれば、値による場合わけもmultiple dispatchで書けるのだろうけれど、その場合は、methodを呼ぶ前に型で判定するという部分が、曖昧になってしまいそう。理論としてはおもしろいかもしれないけれど。
juliaのマニュアルを読んでいたら、この場合わけに相当する定義の書き方は細かすぎると性能が悪くなる場合があるので、気をつけようみたいなことが書いてあったのだけれど、うろ覚えでその基準はいまだよくわかっていない。
(↑がどこに書いてあったのか忘れた)
###デバッグするときの話
この書き方をした場合、デバッグ時に、分岐する前のxの値を@showでみるというようなことが、場合によっては書けない/書きづらい。
つまり、こういうコード。
function myfunc(x::All)
@show x
if x isa NUmber; ...n
それぞれの書き方に応じたテスト/デバッグのやりかたがあるというだけなのだろうけど、ずっとはっきり意識していなかったことなので、ここでまとめてみた。
しばらくぶりにマニュアルを見たが、Methodsの項長い・・・読まないと・・・つらい・・・