我可以使记录更灵活吗?
有人可以给我一个如何使插入数据到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
。
你看到你经常看到这样的例子吗?
我想说在F#中使用mutash记录不是很习惯。
Immutability是一个相当大的主题 在这里一个答案来解释,但 简述:不变性意味着用户可创建的 对象永远不会改变: 他们留他们在 创作的方式。在不可改变的世界里,当你想'改变'一些东西时,你会创建一个新的东西,然后扔掉旧的那个东西 。
无论如何,如果我正确理解你的问题,你实际上是在谈论变异data
,而不是记录。所以,你可以有:
let data = []
let data = {name = "Thomas";id = "000"} :: data
let data = {{name = "Johny";id = "001"} :: data
但是在这种情况下,你是不是真的“改变”的数据,你每次只需创建一个新的列表,并指向它的数据。
谢谢,是的,我已经知道使用你的代码它不会改变数据。我只想编写简单的应用程序,例如我用C++编写,存储数据,删除数据,搜索数据以及查看数据。在C++中,我使用数组,这很容易..我只是试图使用这个简单的应用程序record..but但我发现它很难 – 2011-03-13 06:00:05
你好先生,非常感谢你的答案。你能再帮我一次吗?我仍然是F#的新手。如果使用你的代码,这意味着名称值应该是一些字符串,是否正确?你能给我建议先生吗?如何学习这门语言,因为我试图通过编写书本的例子来学习,但是当我想写一些应用程序时,我以类似于命令式语言的代码结束了代码,然后最终我对这个概念感到困惑语言。我有点沮丧在这里:) – 2011-03-13 05:51:18