Когда тип F # нужно инициализировать с помощью нового?

Для класса, такого как:

type MyClass() =
    member this.Greet(x) = printfn "Hello %s" x

целесообразно инициализировать экземпляры с помощью

let x = new MyClass()

или без new?

Кроме того, когда используется конструктор new, более полезный, чем привязка do с параметрами, предоставленными определению типа?

Ответ 1

Мой шаблон в F # для использования нового - это делать только тогда, когда тип реализует IDisposable. Особые случаи компилятора используют и выдает предупреждение, если new опущено.

Итак, в вашем случае я бы не использовал new. Но со следующим я бы

type OtherClass() =
  ...
  interface System.IDisposable with 
    member this.Dispose() = ...

let x = new OtherClass()

Ответ 2

F # spec:

68 6.5.2 Выражения построения объектовВыражение формы new ty (e1... en) является выражением построения объекта и строит новый экземпляр типа, обычно путем вызова метода конструктора в типе.

14.2.2 Проверка качества товараКонструкция объекта ty (expr) обрабатывается как вызов конструктора объекта, как если бы она была написана новой ty (expr).

Компилятор F # выдает предупреждение, если экземпляр типа, реализующий IDisposable, создается с синтаксисом Ty(), исключающим ключевое слово новое. Spec ничего не говорит об этом факте, однако я думаю, что следует упомянуть определенность.