在我作为开发人员的工作中我必须解决的大多数问题都与数据建模有关.例如,在OOP Web应用程序世界中,我经常需要更改对象中的数据属性以满足新的要求.
如果我很幸运,我甚至不需要以编程方式添加新的"行为"代码(函数,方法).相反,我可以通过注释属性(Java)来声明添加验证甚至UI选项.
在函数式编程中,由于模式匹配和数据构造函数(Haskell,ML),添加新数据属性似乎需要大量代码更改.
如何最大限度地减少此问题?
这似乎是一个公认的问题,因为Xavier Leroy在"对象和类与模块"的第24页很好地说明 - 总结那些没有PostScript查看器的人,它基本上说FP语言比OOP语言更好地添加新的对数据对象的行为,但OOP语言更适合添加新的数据对象/属性.
FP语言中是否有任何设计模式可以帮助缓解此问题?
我已经阅读了Phillip Wadler 建议使用Monads来帮助解决这个模块化问题,但我不确定我是怎么理解的?
我面临着构建要集成到大型现有C代码库中的新组件的任务.该组件本质上是一种编译器,并且将足够复杂以至于我想在OCaml中编写它(出于与这里给出的原因一致的原因).我知道OCaml-C交互是可能的(根据手册和本教程),但它看起来有些痛苦.
我想知道的是,这里的其他人是否尝试过大规模集成OCaml和C代码,他们发现了一些意想不到的问题,以及他们最终是否认为他们会更好只需在C中编写新代码
注意,我不是要开始讨论功能性与命令式编程的优点:让我们假设我们假设OCaml恰好是我想到的工作的正确工具,并且集成的潜在困难是唯一的问题.我也没有选择重写代码库的其余部分.
提供有关任务的更多细节:我需要实现的组件是某种查询优化器,它结合了我在加州大学戴维斯分校工作的一些研究思路,并将集成到PostgreSQL中,以便我们可以运行实验.(查询优化器本质上是一个编译器.)组件将从C代码调用,它将主要独立运行,但会对其他PostgreSQL组件进行一定数量的调用以检索系统目录信息之类的东西,并构建一个复杂的C数据结构(表示物理查询计划)作为输出.
对于这个有些开放式问题的道歉,但我希望社区可以为我节省一点麻烦:)
谢谢,
TJ
假设我正在为F#中的特定于域的语言构建解析器.
我已经定义了一个区分联合来表示表达式:
type Expression =
| Equality of Expression*Expression
| NonEquality of Expression*Expression
| Or of Expression*Expression
| And of Expression*Expression
| If of Expression*Expression
| IfElse of Expression*Expression*Expression
| Bool of bool
| Variable of string
| StringLiteral of string
Run Code Online (Sandbox Code Playgroud)
现在,我已经建立了一个类型的AST,Expression并希望为它生成代码.我有一个函数,它对表达式进行类型推断和类型检查.
它被定义为
let rec InferType expr =
match expr with
| Equality(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| Or(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| And(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
...
Run Code Online (Sandbox Code Playgroud)
我还有另一个函数来生成遵循类似模式的代码:获取表达式,为union中的每个项写入模式匹配语句.
我的问题是:这是用F#做的惯用方式吗? …