加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 函数式编程的非数值用例?

发布时间:2020-12-16 09:47:56 所属栏目:安全 来源:网络整理
导读:我刚刚读完一本关于scala的书。令我震惊的是,整本书中的每一个例子都是某种形式的数字。 像许多程序员一样,我使用的唯一的数学是离散和组合数学,通常这不是数学我以明确的方式编程。我真的缺少一些令人信服的例子,常规的oo算法的功能替代/补充。 什么是
我刚刚读完一本关于scala的书。令我震惊的是,整本书中的每一个例子都是某种形式的数字。

像许多程序员一样,我使用的唯一的数学是离散和组合数学,通常这不是数学我以明确的方式编程。我真的缺少一些令人信服的例子,常规的oo算法的功能替代/补充。

什么是一些非数值用例的函数式编程?

解决方法

我的公司要求我编写一个自定义应用程序,允许用户对平面文件数据库执行即席查询。这个程序的用户是你典型的乔商人类型。他们不是程序员,他们不可能在他们的生活中看到一个SQL语句。

因此,我的任务是开发一个友好的用户界面,允许用户选择列,表,条件等来构建查询。这是具有挑战性的,因为我可以在UI中表示SQL语句,而无需先在内存中创建它的抽象表示。

第一次迭代是用C#编写的。我创建了一个boatload类来表示SQL语句的抽象语法,这导致了一个非常繁琐的对象模型:

>一个Join类,一个Joins集合类
>一个WhereClause类,一个WhereClauses集合类
>一个SelectedColumn类,SelectedColumns集合类
>一个OrderBy类,OrderBy集合集合类
>一个SqlStatement类,将所有前面的类分组在一起

将一个SqlStatement实例转换为一个字符串是光荣的痛苦,丑陋和buggy。移动对立方向,从字符串到SqlStatement,甚至更糟,因为它使用大量的regex和字符串操作打破了一个SQL字符串的部分。

我黑客在一起的系统,产生了一个工作的应用程序,但我不是很高兴。我特别是没有发生,当应用程序的业务需求改变了我,这迫使我重新访问我的C#代码。

正如一个实验,我在F#中重写了我的SqlStatement,并将其表示为联合:

type dir = Asc | Desc
type op = Eq | Gt | Gte | Lt | Lte
type join = Inner | Left | Right

type sqlStatement =
    | SelectedColumns of string list
    | Joins of (string * join) list
    | Wheres of (string * op * string) list
    | OrderBys of (string * dir) list

type query = SelectedColumns * Joins * Wheres * OrderBys

少量的代码替换了几百行的C#和十几个类。更重要的是,模式匹配简化了将抽象表示转换为SQL字符串所需的过程。

有趣的部分是使用fslex / fsyacc将SQL字符串转换回查询对象。

如果我记得正确,原来的C#代码总共600行和大约十几个类,大量的凌乱的正则表达式,并要求两天写和测试。相比之下,F#代码由一个大约40行,一百行左右的.fs文件组成,以实现词法分析器/解析器,并消耗我的一天几个小时来测试。

认真地,在F#中写这个应用程序的这部分感觉像作弊,这是多么简单容易。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读