我可以使记录更灵活吗?

问题描述:

有人可以给我一个如何使插入数据到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"} 
    ] 

我们不能开始根本没有数据,并将数据插入到记录以后呢?

(我的意思是不一样的例子中,数据的价值的声明,因此,例如:该程序正在运行,要求我们插入数据)

我们可以做这样的事情了创纪录?

如果你在谈论指定记录的值,因为它们变得可用,那么你需要做记录option这样的领域,你可以代表一个事实,即值缺失。我会用一成不变的记录,因为这是在实用的风格较为常见:

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

现在你可以创建一个只ID记录,并在用户进入其添加名称:

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 

另外,您也可以使用序列表达式(参见例如free Chapter 12(PDF)现实世界的函数式编程)。如果您的用户交互涉及等待事件(例如鼠标点击),那么您仍然可以使用此样式,但是您需要将所有内容都包含在异步工作流程中并使用Async.AwaitEvent

+0

你好先生,非常感谢你的答案。你能再帮我一次吗?我仍然是F#的新手。如果使用你的代码,这意味着名称值应该是一些字符串,是否正确?你能给我建议先生吗?如何学习这门语言,因为我试图通过编写书本的例子来学习,但是当我想写一些应用程序时,我以类似于命令式语言的代码结束了代码,然后最终我对这个概念感到困惑语言。我有点沮丧在这里:) – 2011-03-13 05:51:18

你看到你经常看到这样的例子吗?

我想说在F#中使用mutash记录不是很习惯。

Immutability是一个相当大的主题 在这里一个答案来解释,但 简述:不变性意味着用户可创建的 对象永远不会改变: 他们留他们在 创作的方式。在不可改变的世界里,当你想'改变'一些东西时,你会创建一个新的东西,然后扔掉旧的那个东西 。

无论如何,如果我正确理解你的问题,你实际上是在谈论变异data,而不是记录。所以,你可以有:

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

但是在这种情况下,你是不是真的“改变”的数据,你每次只需创建一个新的列表,并指向它的数据。

+0

谢谢,是的,我已经知道使用你的代码它不会改变数据。我只想编写简单的应用程序,例如我用C++编写,存储数据,删除数据,搜索数据以及查看数据。在C++中,我使用数组,这很容易..我只是试图使用这个简单的应用程序record..but但我发现它很难 – 2011-03-13 06:00:05