有没有使用代数数据类型的Haskell数据库?

11

我在业余时间用Haskell编写词汇训练器。

我有一个包含单词的文件,其中每个词条都被建模为代数数据类型,看起来像:

Word { _frq=1
     , _fra="le"  
     , _eng="the; him, her, it, them"
     , _deu="der,die,das; er,sie,es"
     , _uses=[Determiner [], Pronoun []]
     , _phrase=" vive la politique, vive l'amour"
     , _sentence="long live politics, long live love"
     , _satz="Lang lebe die Politik, lang lebe die Liebe."
     }

通常情况下,德文翻译的_deu=_satz=最常见的情况是空字符串,我希望在程序中更新它们。

现在我有几个问题: 1. 是否有使用Haskell数据类型的数据库(我真的想在我的数据库中实现类型安全性)? 我找到的东西是HDBC绑定到MySQL之类的东西,还有一些xml / JSON内容。

  1. 如果我更新文件而不使用数据库,是否有避免重新编译整个程序的方法 - 这可能有点乏味。

第三个问题

我想将学习的词汇保存在一个数据结构中,该数据结构需要经常更新,因为每次学习步骤中我都会更新表示该单词知识水平的数字 - 并在插入/或之后对该数据结构进行排序。 然后,我根据其在此数据结构中的位置选择一个新单词。如果使用列表进行完整的遍历,效率似乎低下,并且如果有更好的解决方案,则排序是一项巨大的工作。 最后注意,我只有5000个列表条目,所以也许在错误的地方担心速度?

2个回答

11

在数据库方面,可以看看Acid-State。在Happstack Crash Course中也有它的教程

它可以在模型中保持类型安全,符合您的需求。我不确定这对您有多大用处,但我已经在几个Web应用程序中使用它,包括这里这里(后一个是将HDBC与MongoDB和AcidState进行基准测试的一部分,因此您可以使用它来查看Haskell Web应用程序上下文中这三者的实现方式如何相比较)。

关于您的第三个问题,在5000次插入/读取时,您真的不必担心性能问题。如果您查看我提到的那些基准测试,"large"基准测试会非常快速地运行(相对较小的)50,000次事务,并且它们比您似乎要做的更重要。


1
http://acid-state.seize.it/ 服务器在2016-07-17没有响应。我已经将链接更改为GitHub存储库。如果这是一个临时错误,请随时恢复原始链接。 - John F. Miller

9
请看 Yesod 的 Persistent

Persistent 是 Yesod 中数据存储的解决方案 - 一个类型安全、通用的 Haskell 数据存储接口。

[...]

Persistent 允许我们在已有高度优化的不同数据存储用例的数据库之间进行选择,与其他编程语言互操作,并使用安全且具有生产力的查询接口,同时仍保持 Haskell 数据类型的类型安全性。

Persistent 遵循类型安全和简洁、声明性语法的指导原则。


4
持久化可以处理像 Either 这样的求和类型吗? - Gabriella Gonzalez
@GabrielGonzalez 我还在学习中,所以不确定,但猜测是不行的。 - Petr
3
它对于总和类型有基本支持,但这种支持主要基于数据库约束而非允许完全任意的 ADT 嵌入。 - Michael Snoyman
请问您能否提供一个指针,展示持久化如何支持求和? - tillmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接