scala – 函数式编程的非数值用例?
我刚刚读完一本关于scala的书。令我震惊的是,整本书中的每一个例子都是某种形式的数字。
像许多程序员一样,我使用的唯一的数学是离散和组合数学,通常这不是数学我以明确的方式编程。我真的缺少一些令人信服的例子,常规的oo算法的功能替代/补充。 什么是一些非数值用例的函数式编程? 解决方法
我的公司要求我编写一个自定义应用程序,允许用户对平面文件数据库执行即席查询。这个程序的用户是你典型的乔商人类型。他们不是程序员,他们不可能在他们的生活中看到一个SQL语句。
因此,我的任务是开发一个友好的用户界面,允许用户选择列,表,条件等来构建查询。这是具有挑战性的,因为我可以在UI中表示SQL语句,而无需先在内存中创建它的抽象表示。 第一次迭代是用C#编写的。我创建了一个boatload类来表示SQL语句的抽象语法,这导致了一个非常繁琐的对象模型: >一个Join类,一个Joins集合类 将一个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#中写这个应用程序的这部分感觉像作弊,这是多么简单容易。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |