Построение записи F # с помощью позиционных аргументов - PullRequest
2 голосов
/ 06 октября 2011

Можно ли взять запись типа:

type Foo = {
  Bar: int
  Baz: double
}

И сконструировать ее как вызов функции?(Возможно let foo = Foo 3 4.5, но, похоже, это не сработает.)

Прямо сейчас, чтобы получить ту функциональность, которую я делаю

let createFoo bar baz = { Bar = bar; Baz = baz }

Но я хочу убедиться, что яне пропуская что-то.

Спасибо, и извините, если об этом уже спрашивали!

Ответы [ 4 ]

4 голосов
/ 06 октября 2011

Пока не упоминается, что вы можете добавить метод к типу записи, например

type Foo = {
  Bar: int
  Baz: double
}
with
    static member create bar baz =
        {Bar=bar; Baz=baz}

А затем используйте его как

let foo = Foo.create 3 4.5

(поэтому вы должны работать с синтаксисом, но он хорошо организован как часть типа).

2 голосов
/ 06 октября 2011

Как уже упоминалось, записи могут быть созданы только с использованием синтаксиса построения записей. Другая альтернатива использованию записей (кроме класса, упомянутого Брайаном) - это использование дискриминационного объединения с одним случаем.

Таким образом, объявление типа и построение значения представляют собой одну строку:

type Foo = Foo of int * float

// Create value of 'Foo'
let value = Foo(42, 4.2)

// Decompose value into int and float in a function call
let add (Foo(n, f)) = 
  (float n) + f

Этот способ объявления типа довольно прост, поэтому он хорошо работает при интерактивном написании кода. Для общедоступного API, который используется в C #, класс, безусловно, является лучшим выбором.

1 голос
/ 06 октября 2011

номер

Обратите внимание, что существует замечательная вещь, называемая "класс", с вещью, называемой "конструктор", которая кажется подходящей для вашего сценария. :)

Кроме того, вы всегда можете определить функцию

let mkFoo x y = { Bar=x; Baz=y }
0 голосов
/ 06 октября 2011

Я не думаю, что это возможно - мое предположение относительно того, что было бы, что произойдет, если у вас есть

type Foo = {
  Bar: int
  Baz: int
}

Тогда как компилятор узнает, какой элемент и куда идет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...