Могу ли я сделать запись более гибкой?

Может ли кто-нибудь дать мне пример того, как сделать вставку данных в запись F # более гибкой?

Я часто вижу примеры использования таких записей:

type Employee = {mutable name:string; mutable id:string}

let data = 
    [{name = "Thomas";id = "000"};
     {name = "Johny";id = "001"};
     {name = "Lucky";id = "002"};
     {name = "Don";id = "003"}
    ]

Разве мы не можем начать вообще без данных и вставить данные в запись позже?

(Я имею в виду, что без объявления значения данных, как в примере, например: программа запущена и просит нас вставить данные)

Можем ли мы сделать что-то подобное с записью?


person alex_nan    schedule 11.03.2011    source источник


Ответы (2)


Если вы говорите об указании значений записи по мере того, как они становятся доступными, то вам необходимо создать поля записи option, чтобы вы могли представить факт отсутствия значения. Я буду использовать неизменяемые записи, потому что это чаще встречается в функциональном стиле:

type Employee = { Name:option<string>; ID:option<string> }  

Теперь вы можете создать запись только с идентификатором и добавить имя, когда пользователь вводит ее:

let empty = { Name = None; ID = Some 123 }
let name = // read name from user
let full = { empty with Name = name }

Если вы говорите о добавлении элементов в список по мере их появления, у вас есть несколько вариантов. Прямой - написать рекурсивную функцию, которая многократно считывает запись и строит список:

let rec readData i records = 
  let name = // read name from user 
  if name <> "" then
    // Create new record and add it to our list
    let itm = { Name = name; ID = string i }
    readData (i + 1) (itm::records)
  else 
    // Return records that we collected so far in the right order
    records |> List.rev

В качестве альтернативы вы также можете использовать выражения последовательности (см., Например, бесплатную главу 12 (PDF) Real- Мировое функциональное программирование. Если ваше взаимодействие с пользователем связано с ожиданием событий (например, щелчком мыши), вы все равно можете использовать этот стиль, но вам нужно будет обернуть все в асинхронный рабочий процесс и использовать Async.AwaitEvent.

person Tomas Petricek    schedule 11.03.2011
comment
привет, сэр, большое спасибо за ваш ответ. Ты можешь мне снова помочь? Я все еще новичок в F #. Если вы используете свой код, это означает, что значение имени должно быть какой-то строкой, это правильно? и вы можете дать мне совет, сэр? как выучить этот язык, потому что я пытаюсь научиться писать пример из книги или иначе, но когда я хочу написать какое-то приложение, я закончил с кодом, как я делаю с императивным языком, и, наконец, я закончил путаницу с концепцией этого язык. Я немного расстроился здесь :) - person alex_nan; 13.03.2011

Вы видели, что вы часто видели такой пример?

Я бы сказал, что в F # не очень идиоматично использовать изменяемые записи.

Неизменяемость - довольно большая тема для объяснения в одном ответе здесь, но кратко: неизменяемость означает, что объекты, которые вы создаете, никогда не изменяются: они остаются такими, какими были при создании. В неизменном мире, когда вы хотите что-то «изменить», вы создаете новое и выбрасываете старое.

В любом случае, если я правильно понимаю ваш вопрос, вы на самом деле говорите о мутации data, а не о записи. Итак, у вас могло быть:

let data = []
let data = {name = "Thomas";id = "000"} :: data
let data = {{name = "Johny";id = "001"} :: data

Но в этом случае вы на самом деле не «меняете» данные, вы просто каждый раз создаете новый список и указываете на него данные.

person Benjol    schedule 11.03.2011
comment
спасибо, да, я уже знал, что использование вашего кода не меняет данные. Я просто хочу написать простое приложение, например, написать на C ++, хранить данные, удалять данные, искать данные и просматривать данные. В C ++ я использовал массив, это довольно просто ... Я просто пытаюсь сделать это простое приложение, используя запись ... но мне было сложно - person alex_nan; 13.03.2011