假设我有这种类型的报价 Quotations.Expr<(int -> int -> int)>
<@ fun x y -> x + y @>
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数fun reduce x expr,当被调用时,reduce 1 expr本质上会产生
<@ fun y -> 1 + y @>
Run Code Online (Sandbox Code Playgroud)
即我想部分应用报价来产生另一个报价.
我确信这是可行的,有没有人有任何想法?以前是否曾尝试过?似乎找不到任何东西.
另外我对LISP不是很熟悉 - 但这与我用LISP宏实现的基本相似吗?
更新:在减少报价时,我想评估可以在结果表达式树中评估的零件.
例如:reduce true <@ fun b x y -> if b then x + y else x - y@>应该导致<@ fun x y -> x + y @>.
我的F#应用程序具有非常好的F#模型,充分利用了F#类型系统(联合,记录,元组和基元类型).我试图找出将这些数据类型保存到SQL-Server数据库的最佳方法.
让我们做出以下假设:
我想要持久化的中心实体是一个被称为的判别联盟,Task它有大约30个不同的联合案例,每个案例具有完全不同的属性(可能是其他的DU,记录或元组或原始类型),这使得使用矩形关系表格实施起来非常繁琐
我希望每周多次不断改进这些模型,CI会在提交后立即将我的应用程序部署到生产中.同样,使用常规表会使ALTER TABLE语句减慢我的开发和部署速度,并且会增加大量的认知过载,任何新开发人员都会在这个系统上遇到挑战
在进行模型演变后,我应该能够轻松地使用后台进程在线升级我的旧模型,或者从数据库中获取时,使用接近0的停机时间
我应该能够在任意深度查询这些模型,并且我已经接近一百万行来处理,并且这将继续增长.查询速度应该很快,最多为100毫秒
我需要使用SQL Server,因为此应用程序是较大系统的一小部分,我希望任何数据库操作都参与任何正在进行的数据库事务
TaskJSON这是我的第一次尝试 - 将所有内容存储为JSON,识别可查询值,使用SQL Server 2016的新JSON函数将它们存储在索引表中.SQL Server中的JSON函数非常快,但索引这些查询要求我使用持久+计算+索引列或索引视图.
烦恼:
非常难以进化模型,特别是如果我想要进化所有类型X的实例,这些实例可能出现在不同联合情况的不同深度.没有标准化的语言可以指出这些演变
JSON不区分十进制/浮点数/数字,这有时很难处理,我需要自定义格式化程序.小问题,没什么大不了的.
查询语言在任意深度都有些原始,并且这些查询没有索引,因此新查询几乎总是要求我创建计算列或更改索引视图.
将新的索引列添加到索引视图不是ONLINE操作并导致停机,并且很难在CI中自动化
在同一个表中使用PERSISTED COLUMNS有时会导致SQL Server在搜索/选择时没有真正使用它们,而是从头开始重新计算这些值(因为它在查询计划器中没有准确地计算出这个操作的成本)
TaskXML这是我目前的实施.
我编写了自己的自定义XML序列化程序,这使我很容易使用XQuery和SQL Server的xml数据类型列查询数据库
使用功能非常强大的XSLT,模型演变变得轻而易举
问题:
我对我的XML解决方案非常满意 - 我只需要一种方法来加快我的XML查询,我想在这一点上,我已经达到了SQL Server可以提供的极限.
还有其他方法我错过了F#社区试图能够持久保存非常丰富的F#数据模型吗?