 <p>This is a <em>one-to-one</em> translation to F#:</p> <pre class="lang-ml prettyprint-override"><code>type A() = let mutable _items = null member this.items with get() = if _items = null then _items &lt;- DAL.FetchFromDB() _items let a = A() let x = a.items // db access here let y = a.items </code></pre> <p>There are better (and shorter) ways to write equivalent code in F# using objects (see the other answer), but you don't need to create an object at all, you can simply define a function and as others already pointed out you can use the <code>lazy</code> keyword:</p> <pre class="lang-ml prettyprint-override"><code>let items = let v = lazy DAL.FetchFromDB() fun () -&gt; v.Value let x = items() // db access here let y = items() </code></pre> <p>or use the standard lazy value directly, I would prefer this because you are making explicit in the type of <code>items</code> that your value is lazy evaluated instead of hiding it behind a <em>magic</em> object property or function:</p> <pre class="lang-ml prettyprint-override"><code>let items = lazy DAL.FetchFromDB() let x = items.Value // db access here let y = items.Value </code></pre> <p>So now the type of <code>items</code> is <code>Lazy&lt;'List&lt;'T>></code> which is always telling you that the value will be lazy computed, apart from that in this case the code is actually shorter.</p>