- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个记录,例如Person
,并且我希望能够通过多个数据结构查找此人。也许有一个按姓名的索引,另一个按人的邮政编码的索引,以及另一个按人的当前纬度和经度的索引。也许还有更多的数据结构。所有这些都存在,因为我需要有效地查找一个或多个具有不同标准的人。
如果我只需要读取一个人的属性,this is no problem .但是现在假设我需要使用其中一种数据结构查找一个人,然后更新该人的数据。
在 OOP 语言中,每个数据结构都指向内存中的同一个人。因此,当您更新一个时,您也在隐式更新其他数据结构的所指对象。这几乎是副作用和杂质的定义。我知道这与 Haskell 范式完全背道而驰,而且我不希望 Haskell 以这种方式工作。
那么,Haskell 式的方法是什么?需要明确的是,问题是这样的:我通过一个数据结构查找一个人,然后将该人(可能还有一些其他任意数据)传递给 ArbitraryData -> Person -> Person
类型的函数。 .如何在所有各种查找结构中传播此更改?
作为一个相对较新的 Haskell,我的第一直觉是每次更新一个人时,用新更新的人重建每个查找结构。但这似乎是一种仪式,我有很多机会以 GHC 无法检测到的方式搞砸,而且一点也不优雅。 Haskell 以其优雅而闻名,我无法想象它缺少一个优雅的解决方案来解决这样一个常见的基本问题。所以我想我错过了一些东西。
作为引用,这个问题扩展了我在以下问题中讨论的一些问题:
Multiple lookup structures for same data: Memory duplication?
Identity of simulation objects in Haskell
编辑
我刚刚想到的一个解决方案:不要在主状态下维护每个查找结构的副本。只需保留一份所有人员的列表,这是我们更新人员时唯一需要更新的内容。每次您需要按邮政编码查找时,将所有人的列表传递给一个函数,该函数会生成有效的按邮政编码数据结构。然后对结果执行查找。
我不知道这是否有效。如果它导致 CPU 在每次使用时实际上都重新计算查找结构,这是 Not Acceptable 。但我知道 Haskell 有时可以避免重新评估相同的表达式。不幸的是,我还没有弄清楚什么时候会出现这种情况。所以我不知道这种方法是否可行。
所以换句话说:我可以编写我的函数,就好像它们每次都在计算查找一样,而实际上 GHC 会针对底层数据没有改变的情况对其进行优化?因为这将是我上面确定的问题的一个非常优雅的解决方案。
最佳答案
自从我回答了这个问题后,Freenode 上#haskell 中的一些人推荐了替代的预制解决方案:
Data.IxSet
. Data.Store
,据说可以提供镜片。 Vector
实际的
Person
s。查找表将为您提供
Int
或
Int
的列表s(而不是
Person
或
Person
的列表),它是
Vector Person
的索引.例如:
data PersonStuff = PersonStuff {
persons :: Vector Person,
firstNameLookupTable :: LookupTable Name,
...
}
data LookupTable a = LookupTable {
table :: Map a Int,
update :: Person -> Person -> Map a Int -> Map a Int
}
update
函数被赋予旧的
Person
,更新后的
Person
,并且只有在相关细节发生变化时才会更新表格。当一个
Person
通过方便的
PersonStuff
进行修改您将编写的函数,这些函数将为您更新所有查找表,返回一个新的
PersonStuff
与所有相关数据。这使得具有快速查找的纯数据结构成为可能。
updatePeopleWithFirstName :: Name -> (Person -> Person) -> PersonStuff -> PersonStuff
之类的函数这将得到所有有名字的人,应用
Person -> Person
对于他们每个人,修改他们在
Vector
中的条目,并使用
update
更新所有查找表的函数。
关于haskell - 被多个数据结构引用时更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19502268/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!