![]() |
1
41
首先,我不会说CLOS(公共Lisp对象系统)是“伪OO”。这是头等舱。 第二,我相信你应该使用符合你需要的范例。 当函数是数据流并且实际上不需要状态时,不能无状态地存储数据。 如果你有几个需要混合在一起,混合你的范例。不要限制自己只使用工具箱的右下角。 |
![]() |
2
74
从数据库人员的角度来看,我发现前端开发人员很难找到使数据库适合他们的模型的方法,而不是考虑最有效的使用数据库的方法,这些方法不是面向对象的或功能性的,而是关系和使用集理论。我已经看到了这通常会导致代码性能不佳。此外,它还创建了难以进行性能调优的代码。 在考虑数据库访问时,有三个主要考虑因素:数据完整性(为什么所有业务规则都应在数据库级别执行,而不是通过用户界面)、性能和安全性。编写SQL是为了比任何前端语言更有效地管理前两个考虑事项。因为它是专门设计的。数据库的任务与用户界面的任务相差甚远。奇怪的是,在管理任务时最有效的代码类型在概念上是不同的吗? 数据库保存着对公司生存至关重要的信息。奇怪的是,当企业的生存受到威胁时,他们不愿意尝试新的方法。见鬼,许多企业甚至不愿升级到现有数据库的新版本。因此,在数据库设计中存在着固有的保守性。这是故意的。 我不会尝试编写T-SQL或使用数据库设计概念来创建用户界面,为什么要尝试使用接口语言和设计概念来访问我的数据库?因为你认为SQL不够新颖?或者你觉得不舒服?仅仅因为某些东西不适合你最喜欢的模型,并不意味着它是坏的或错误的。这意味着它是不同的,可能是出于正当的原因而不同。您可以为不同的任务使用不同的工具。 |
![]() |
3
28
你应该看看Ben Moseley和Peter Marks的论文《走出沥青坑》,可从以下网址获得: "Out of the Tar Pit" (Feb. 6, 2006) 这是一个现代的经典,它详细描述了一个称为函数关系编程的编程范例/系统。虽然与数据库没有直接关系,但它讨论了如何将与外部世界(例如数据库)的交互与系统的功能核心隔离开来。 本文还讨论了如何使用关系代数来定义和修改应用程序的内部状态,这显然与关系数据库有关。 本文将不会给出一个关于如何集成数据库和函数式编程的确切答案,但它将帮助您设计一个最小化问题的系统。 |
![]() |
4
23
我想说大多数口齿不清是穷人的功能语言。根据现代的功能实践,它完全可以被使用,但是由于它不需要它们,社区就不太可能使用它们。这导致了各种方法的混合,这些方法可能非常有用,但肯定掩盖了纯功能接口如何仍然有意义地使用数据库。 |
![]() |
5
14
我不认为FP语言的无状态性质是连接到数据库的问题。Lisp是一种非纯函数编程语言,因此它不应该在处理状态时有任何问题。像haskell这样的纯函数编程语言有处理输入和输出的方法,可以应用于使用数据库。 从您的问题看来,您的主要问题似乎在于找到一种很好的方法,将您从数据库中得到的基于记录的数据抽象为lisp-y(lisp-ish?)不用编写大量的SQL代码。这看起来更像是工具/库的问题,而不是语言范式的问题。如果你想做纯fp,也许lisp不是适合你的语言。与纯FP相比,普通的Lisp似乎更多地是关于集成来自OO、FP和其他范例的好想法。如果你想走纯FP路线,也许你应该使用Erlang或Haskell。 我认为Lisp中的“伪OO”思想也有其优点。你可能想试试看。如果它们不适合您处理数据的方式,您可以尝试在Weblocks上创建一个层,该层允许您以您想要的方式处理数据。这可能比你自己写所有的东西更容易。 免责声明:我不是口齿不清专家。我最感兴趣的是编程语言,一直在使用lisp/clos、scheme、erlang、python和一些ruby。在日常编程生活中,我仍然被迫使用C。 |
![]() |
6
14
如果您的数据库不破坏信息,那么您可以按照与“纯功能”编程值一致的功能方式使用它,方法是将整个数据库的函数作为一个值。 如果在T时,数据库声明“Bob喜欢Suzie”,并且您有一个接受数据库和Liker的函数like,那么只要您能在T时恢复数据库,您就有一个涉及数据库的纯函数程序。例如
要做到这一点,你永远不能丢弃你可能使用的信息(在所有的实用性中,这意味着你不能丢弃信息),因此你的存储需求将单调地增加。但是,您可以开始将数据库作为一系列线性离散值来使用,其中随后的值通过事务与先前的值相关。 这是背后的主要想法 Datomic 例如。 |
![]() |
7
12
一点也不。有一种数据库称为“功能数据库”,其中 Mnesia 可能是最容易理解的例子。基本原理是函数式编程是声明性的,因此可以对其进行优化。可以使用 List Comprehensions 对于持久性集合和查询优化程序,可以自动计算出如何实现磁盘访问。 记忆症是写在 Erlang 至少有一个Web框架( Erlyweb )可用于该平台。Erlang本质上是与无共享线程模型并行的,因此在某些方面,它适合于可扩展的架构。 |
![]() |
8
6
我和哈斯克尔在一起很舒服。最突出的haskell Web框架(类似于rails和django)被称为yesod。它似乎有一个相当酷,类型安全,多后端ORM。看看 Persistance chapter 在他们的书中。 |
![]() |
9
4
数据库是跟踪无状态API中状态的完美方法。如果您订阅了REST,那么您的目标是编写无状态代码,该代码与以透明方式跟踪状态信息的数据存储(或其他后端)交互,这样您的客户机就不必这样做。 对象关系映射器的概念,即将数据库记录作为对象导入,然后对其进行修改,对于函数式编程和面向对象编程同样适用和有用。一个警告是函数式编程不会修改 对象 但数据库API允许您修改 记录 就位。客户机的控制流如下所示:
数据库将用您的更改更新记录。纯函数编程可能不允许重新分配变量 在你的计划范围内 但是您的数据库API仍然允许就地更新。 |