I often use verbose syntax to create single-line expressions that usually have multiple lines. I usually do this, so I can send the whole expression to F # interactive with Alt+'. For example, I can do this:
let longLength list = let rec helper result = function [] -> result | _ :: t -> helper (result + 1L) t in helper 0L list
In the sample code, suppose these namespaces were open:
open System
open System.Collections
open System.Collections.Generic
I want to translate this object expression into one line:
let emptyEnumerator = {
new IEnumerator<int> with member t.Current = raise(InvalidOperationException())
interface IEnumerator with
member t.MoveNext() = false
member t.Reset() = ()
member t.Current = raise(InvalidOperationException())
interface IDisposable with member t.Dispose() = ()
}
I found that I can only do this using the detailed syntax. Typically, verbose syntax code also compiles with lightweight syntax, but it is not here. I also tried to create a named class with the same implementation and that almost identical code compiles with both easy and detailed syntax:
open System
open System.Collections
open System.Collections.Generic
#light "off"
type A() = class interface IEnumerator<int> with member t.Current = raise(InvalidOperationException()) end interface IEnumerator with member t.MoveNext() = false member t.Reset() = () member t.Current = raise(InvalidOperationException()) end interface IDisposable with member t.Dispose() = () end end
let b = { new IEnumerator<int> with member t.Current = raise(InvalidOperationException()) end interface IEnumerator with member t.MoveNext() = false member t.Reset() = () member t.Current = raise(InvalidOperationException()) end interface IDisposable with member t.Dispose() = () end end }
#light "on"
type C() = class interface IEnumerator<int> with member t.Current = raise(InvalidOperationException()) end interface IEnumerator with member t.MoveNext() = false member t.Reset() = () member t.Current = raise(InvalidOperationException()) end interface IDisposable with member t.Dispose() = () end end
let d = { new IEnumerator<int> with member t.Current = raise(InvalidOperationException()) end interface IEnumerator with member t.MoveNext() = false member t.Reset() = () member t.Current = raise(InvalidOperationException()) end interface IDisposable with member t.Dispose() = () end end }
, "~ vsB756.fsx(29,150): FS0010: " " . ".
, , . Visual Studio member IEnumerator FS0010. ( , member - , IEnumerator.Reset() IEnumerator.Current.)
Visual Studio "let" ( ), ( "{" ) end IDisposable, , - IEnumerator, .
- ? ?