F # новое ключевое слово. Для чего это?

Во всех примерах классов и записей F # я вижу, что записи создаются или создаются классами через новое ключевое слово или просто по имени типа.

Так, например, если у меня есть эта запись:

type MyRecord = {field1: int; field2:int}
let myvar = {new MyRecord with field1 = 3 and field2 = 3}
let myvar2 = {MyRecord with field1 = 1 and field2 = 2}
let myvar3 = {field1 = 34; field2 = 23}

Они кажутся одинаковыми. То же самое и для этого примера:

type MyClass(x: int) =
   let mutable xx = x
let myvar = MyClass(12)
let myvar2 = new MyClassw(234)

Ну что нового для??? Thnkyou

А... Я знаю, что есть ответы на вопрос о новых классах, но упоминаний о записи нет. Кроме того, я не понимаю, почему новое должно быть факультативным и отвратительно безразличным ключом при построении классов? Возможно ли, что использование нового или не использующее его для классов ничего не меняет?

Ответы

Ответ 1

Ключевое слово new обычно не используется для создания экземпляров F #. Первый пример - синтаксис OCaml-ish для деклараций записей:

let myvar = {new MyRecord with field1 = 3 and field2 = 3}
// Normal F#: let myvar = { MyRecord.field1 = 3; field2 = 3}

Второй пример больше не компилируется:

// Not F#: let myvar2 = {MyRecord with field1 = 1 and field2 = 2}

Для классов вы всегда можете опустить new. Однако вы получаете предупреждение компилятора, если вы создаете экземпляр класса IDisposable без использования ключевого слова new.

// These two are the same
let myvar = MyClass(12)
let myvar2 = new MyClass(234)

// Compiler warning
let f = FileStream("hello.txt", FileMode.Open)

// No warning
use f = new FileStream("hello.txt", FileMode.Open)

Изменить: В ответ на ваш комментарий -

нет ли правила или обоснования, почему новый настолько "гибкий"? Почему это одинаково, используя или не используя новые для классов

new не является обязательным - я не знаю обоснования для его гибкости; было бы хорошо, если бы было какое-то руководство в ту или иную сторону. (Мое предпочтение заключается в том, чтобы никогда не использовать new, кроме как в ответ на предупреждение компилятора.)

почему я получаю предупреждение компилятора при реализации IDisposable

Так как я никогда не использую new нормально, я считаю, что это способ компиляции, напоминающий мне написать use или using, когда я выделяю IDisposable.

и почему записи не используют второй синтаксис, который я написал ранее?

{ new MyRecord with ... } - синтаксис Haskell. Возможно, он был действителен в одном из бета-версий компилятора F #, но он не анализирует F # 2.0. (Почему, по-вашему, это должно быть верным?)

Я пытаюсь найти общее логическое правило/ориентир, а не учиться наставлениям с букетом или разбросанными правилами синтаксиса...

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

Это может помочь: Руководство по разработке компонентов F # [PDF] от Microsoft. Это набор советов - dos и don'ts - для вашего кода F #.