Hatena::Grouphaskell

猫とC#について書く代わりにHaskellとF#について書くmatarilloの日記 このページをアンテナに追加 RSSフィード

2015-08-29

演算子のオーバーロード #5(完結編)

| 12:01 | 演算子のオーバーロード #5(完結編) - 猫とC#について書く代わりにHaskellとF#について書くmatarilloの日記 のブックマークコメント

ちょっと間が空いた。

さて、ここまでを踏まえれば、最初の記事に載せた

.net - F# Overloaded Operator ( *= ) with floats not working with other floats - Stack Overflow

はほぼ理解できる。

  • 組み込みのfloatとユーザー定義のvector2の両方で使えるように、2項演算子 *= をオーバーロードしたい
  • しかし、float同士の*=演算を、後付けで定義することができない
  • そこで、以下のハックを使う
    • 演算子オーバーロードのためだけに、新たなユーザー定義型 Overloadsを定義する
    • ユーザー定義型 Overloadsに、3項演算子 ?<-を定義する
    • その演算子は、Overloads型の値を1つ、*=演算子適用したい型の値を2つ受け取るが、Overloads型の値は捨ててしまい、本来やりたかった*=演算だけを実装する
  • 以上の準備ができたなら、グローバルレベルでのインライン演算子定義で、*=を実装し、Overloads型の?<-演算子にぶん投げる
    • Overloads型の値は演算子オーバーロードの解決に使われた後は捨てられるので、unit的に値が1つしかない型で十分。よって、Overloads型は値が1つしかない判別共用体として定義してもいい。

なんとまあ。分かってしまえば何ということはなかった。?<-を使っているのは単にそれが3項演算子だからってだけのようだし、Overloads型が値が1つしかない判別共用体であることにも大きな意味はなかった。

bleis-tiftbleis-tift2015/09/30 11:31https://code.google.com/p/fsharp-typeclasses/
http://nut-cracker.azurewebsites.net/blog/2011/11/15/typeclasses-for-fsharp/

このあたりの話ですね。
このライブラリは現在はFsControlとして (?<-) を使わない形でより使いやすく作り直されています。

matarillomatarillo2015/11/20 21:07気づくのがすごーく遅くなりました。
https://twitter.com/lyrical_logical/status/667427660218413059 とか https://en.wikipedia.org/wiki/Ad_hoc_polymorphism を読んでて、頭のなかが少しつながりました。