memo.txt

教えていただいたこと、勉強したことのメモです。

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とか__とか)はメンバ毎に決められる。

*1:ILレベルではmoduleもクラス

*2:参照:型に紐づくように見える関数→「続きを読む」の先