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 个列表条目,所以可能是担心速度在错误的地方?

4

2 回答 2

11

数据库方面,看看Acid-State。作为 Happstack Crash Course 的一部分,还有一个教程。

在维护模型中的类型安全方面,它可以满足您的要求。我不确定这对你有多大用处,但我已经将它用于几个网络应用程序,包括这里这里(第二个是 HDBC 与 MongoDB 和AcidState,因此您可以使用它来查看这三个在 Haskell Web 应用程序的上下文中如何比较实现方式)。

对于您的第三个问题,在 5000 次插入/读取时,您真的不应该担心性能。如果您看一下我提到的那些基准,“大”基准以非常短的顺序运行(相对较小的)50 000 个事务,它们比您似乎正在做的插入更多。

于 2013-08-19T14:53:13.737 回答
9

从 Yesod查看Persistent :

Persistent 是 Yesod 对数据存储的回答 - Haskell 的类型安全、通用的数据存储接口。

[...]

Persistent 允许我们在针对不同数据存储用例高度调整的现有数据库中进行选择,与其他编程语言互操作,并使用安全且高效的查询接口,同时仍保持 Haskell 数据类型的类型安全。

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

于 2013-08-19T14:56:39.120 回答