F# Quiz : プロパティ

F# Advent Calender 2015の4日目の、ぐるぐるさんの記事を拝見していました。


僕はお仕事で F# + ASP.NET MVC の組み合わせを使うことが多いのですが、やはりC#/V○前提のフレームワークを用いる時はどうしてもクラスをモリモリ使うことになってしまいます。その辺が少しもどかしい。


さて、記事の中ではメンバーの定義についてはあまり触れられていませんでしたが、F#にはプロパティの実装方法が沢山あります。そして厄介なことに、アクセスした時の振る舞いなどが異なります。でも、手のかかる子ほど可愛い。(?)


そこで、ちょっとF#クイズを用意してみました。
以下の4つのプロパティ*1を評価した時に、それぞれどのような結果となるか考えてみてください。
まずは脳内のF# Interactiveで実行してみてね。



type Quiz() =
let count =
let counter = ref 0
fun () -> incr counter ; !counter

let lazyCount = lazy count ()


member this.PropA = count ()

member val PropB = count ()

member this.PropC with get() = count ()

member this.PropD with get() = lazyCount.Force()


答えはfsiが教えてくれます。(手抜き)
それぞれ複数回評価してみると違いが分かるかもしれません。
現場からは以上です。

おまけ

はてなユーザの皆さん、彩りの存在も思い出してあげてください。(白目
http://irodori.azurewebsites.net/

*1:PropDはおまけです