正文

F# 中 LOP 之“具体表述”2012-01-15 09:24:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/53147.html

分享到:

 http://blog.csdn.net/hikaliv/article/details/4424813

F# 中的 LOP 使用简单代码描述复杂问题的优势体现在如下三个方面:

  1. 抽象表述—— F# 使你在代码中描述特定领域概念时,不需要引入新的抽象层。
  2. 具体表述—— F# 使你可使用其它语言描述问题,然后在 F# 中读取。
  3. 计算表述—— F# 使你使用其它语言编码处理本地概念时,不需要借用第三者更专业化的语言。

       具体表述,Concrete Representation。

       具体表述,是指使用其它语言来具体描述问题,而后将之读取到 F# 程序中。使用你所熟知的 DSL 和 F#,便可以顺利地表达问题。


       fslex 和 fsyacc

       处理某种语言的具体表述的最简单的方法就是创建一个剖析器(parser)和编译器。在这方面,Lex 和 Yacc 做为代码生成剖析器的标准工具已有三十年光景。FsLex 和 FsYacc 就是 Lex 和 Yacc 用以生成 F# 代码剖析器的实现。如果读者对于该工具感兴趣,可以参考这篇文章

       Lex 和 Yacc 就是 DSL,用以描述编译器中的剖析器和文法器(lexer),或某些将源码分解成一系列的记号(token)并将这些记号流转换成一棵抽象句法树(AST,Abstract Syntax Tree)的工具。例如如下 Lex 代码用以将字串“10 * 8 + 5.0”转换成符号 [INT32(10); ASTER; INT32(8); PLUS; FLOAT(5.0)]

11

       相应着的 Yacc 剖析器由语法产物来匹配符号,并建立 AST 节点。

22

       若不理解 Lex 和 Yacc 也不用担心,还有些工具允许你编写 F# 程序来剖析任一种你需要的语言,使你可为所有数学等式编写剖析器,可为 F# 代码编写剖析器,可为结构化日志文件(structured log file)编写剖析器,等等,请读者根据自己使用的 DSL 去查阅。而使用 FsLex 和 FsYacc 可以为任一种 DSL 编写剖析器,然后读取其“抽像表述”到你的 F# 程序中。


       活性模板,Active Patterns

       关于“活性模板”的介绍,可以参考这篇文章。简单理解之,就是将数据从一种表述典型地通过模式匹配转化成另一种表述的过程。活性模板主要分三种:单例(Single - Case)、多例(Multi - Case)、部分(Partial)。


       单例活性模板

       单例活性模板获取一种类型的输入并将之转化成其它形式的输出。如下例将字串转成整型,注意活性模板的结果在“match”语句的末尾。

33

       多例活性模板

       多例活性模板将输入分流成几部,并将之对应转化为一组类型之一的输出。如下例将整数转化为三种类别之一:奇、偶、零。

44

       部分活性模板

       部分活性模板有点像单例模式。单例模板的问题是,不一定总能成功地返回结果;如前例所示,将字串转为整型,但是并非每个字串都可以转为整型,像“250”可以转为整型值,而像“FUCK”这种就无法转为整型值。部分活性模板使用“可选类型”来描述数据是否可转化。于此仍然以字串转数值为例。

55


       复杂的活性模板可能会显得不易于阅读,但当你对这一语素所传递的理念有了深彻理解后,会发现用它来转化数据得心应手,简便快捷。

阅读(2403) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册