F#の関数とメソッド
(F#レベルでの)*1型に紐づくのがメソッド。
型ではなくmodule、関数、値などに紐づくのが関数。*2
どちらかでしかできないこと
module内の関数だけ
- moduleをopenすればmodule名なしで使える
- カリー化形式での定義(メソッドではタプル形式でないと警告が出る)
- アクティブパターンの定義
使い分け
基本は関数を使う。
型に紐づくように見える関数
type T() = let f x = ...
この場合の関数f()は、型Tのプライマリコンストラクタ(memberの定義より前すべての部分)に紐づく。
型に紐づいているのではないので、メソッドではない。
プライマリコンストラクタなので、メンバでもない。
type T(a, b) as this = let f() = this.A * this.B member private x.A = a member private y.B = b member z.C = f() member aa.D = this.A member bb.E = bb.B
T(3, 4).C (* 12 *) T(3, 4).D (* 3 *) T(3, 4).E (* 4 *)
こんなのも書ける。
- "as this"と"this.~"で、プライマリコンストラクタ内で自身のメンバにアクセスできる。(thisはxでもselfでもなんでもいい。)
- 上記thisのスコープは型全体。
- 自己識別子(xとか__とか)はメンバ毎に決められる。