当前位置:  开发笔记 > 编程语言 > 正文

函数式编程的非数字用例?

如何解决《函数式编程的非数字用例?》经验,为你挑选了5个好方法。

我刚读完一本关于scala的书.令我震惊的是,整本书中的每一个例子都是某种形式的数字.

像许多程序员一样,我使用的唯一数学来自离散和组合数学,而且通常不是数学我以明确的方式编程.我真的错过了常规oo算法的功能替代/补充的一些引人注目的例子.

什么是函数式编程的非数字用例?



1> Juliet..:

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

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

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

一个Join类,一个Joins集合类

WhereClause类,WhereClauses集合类

SelectedColumn类,SelectedColumns集合类

OrderBy类,OrderBy集合集合类

一个SqlStatement类,它将所有上述类组合在一起

将SqlStatement实例转换为字符串是非常痛苦,丑陋和错误的.将字符串方向从字符串移动到SqlStatement更糟糕,因为它使用大量的正则表达式和字符串操作来分解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文件组成,大约100行左右来实现词法分析器/解析器,并且耗费了几天的时间进行测试.

说真的,在F#中编写应用程序的这一部分感觉就像是作弊,这是多么简单易行.


虽然这里有很多很棒的答案我会选择你的,因为我觉得它很漂亮

2> Diomidis Spi..:

我们使用Haskell实现特定于域的语言来描述,定价和监控外来衍生产品.



3> Mark Cidade..:

函数式编程是一种范式,如过程/结构化,面向对象,以及泛型/模板化编程.这是完美的,所以你可以做任何你想做的事情.

除了数学和科学之外,它还使分析器组合器,人工智能,并发性,动态评估,协同例程,延续,简洁符号(更快的大脑到键盘到文本文件循环和更少的代码维护)变得更容易,强类型参数化(参见Haskell的代数类型)和动态自反射(例如,带有REPL的简约metacircular解释器).



4> BobbyShaftoe..:

您可能有兴趣与Erlang的创建者一起收听软件工程广播的这一集,Erlang是在为Ericsson工作时开发的.

http://www.se-radio.net/podcast/2008-03/episode-89-joe-armstrong-erlang



5> Juliet..:

为您找到了另一个:

我参与了一套针对中小型银行,地方政府,证券交易所等的新型企业级金融产品原型设计的早期阶段。您可能在想:“哦,金融法规,您必须做很多数学” –实际上,不。这些产品旨在高度可定制,并允许用户在应用程序的战略要点注入业务规则。

我们正在使用F#表示和解释业务规则。为了使用一个简单的例子,让我们编写一些代码进行检查处理,我们可能会编写如下规则:

type condition =
    | Test of string
    | And of condition * condition
    | Or of condition * condition
    | Not of condition

type transactionWorkflow =
    | Reject
    | Approve
    | AdministratorOverride of string
    | If of condition * transactionWorkflow list
         (* condition,  true condition *)
    | IfElse of condition * transactionWorkflow list * transactionWorkflow list
         (* condition,      true condition,            false condition *)
    | AttachForms of string list

使用特殊的应用程序,用户可以编写一些由上述结构表示的业务规则。例如:

let checkProcessingWorkflow =
    [If(Test("account doesn't exist")
        ,[AdministratorOverride("Account doesn't exist. Continue?");
          AttachForms ["40808A - Null Account Deposit"]]
       );
     If(Test("deposit > 10000")
        ,[
            If(And(Test("account created within 3 months")
                   ,Test("out of country check"))
               ,[Reject]);
            IfElse(Test("account state = TX")
                    ,[AttachForms ["16A"; "16B"]]
                    ,[AttachForms ["1018"]]
                 )
         ]
       );
     Approve
    ]

因此,我们不是编写一个业务规则引擎来统治所有规则,而是将某些过程作为F#所解释的一种很小的领域特定语言来处理。我希望这种方法将使我们能够设计非常简单的业务可读DSL,而无需检测冲突规则。

当然,以上所有内容只是概念代码,我们甚至还处于原型阶段,甚至只是对我们的规则系统之一进行原型设计。出于一个特定原因,我们使用F#而不是Java或C#:模式匹配。

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有