- 浏览: 119380 次
- 来自: ...
文章分类
最新评论
〇,简介
Gavator(Generic Java Functor)试图探索以普通Java语法进行函数式编程的可行性,并尽可能的保证使用的方便性,良好的可读性和基本的类型安全性
- source code: svn checkout http://jade-stone-suite.googlecode.com/svn/trunk/JS.Functor
一,功能
所有功能都是类型安全的,无需涉及强制转型
-
提供了若干算法:transform/map, select/filter, accumulate/reduce, foreach/enumerate, findfirst等
-
提供了若干适配器:bind,bind1st, bind2nd等
-
提供了常用控制结构的函数形式和functor形式:dowhile/whiledo, dountil/untildo, ifelse等
-
提供了常用逻辑运算结构的函数形式和functor形式:and,or,not等
-
提供了常用数据结构:filter,pipe等
二,结构
Gavator的结构是层次化的
-
最核心的是一组接口:分别定义了Procedure,Predicate,Function的零元,一元,二元形式
-
基于这些接口,以functor的形式提供了常用概念的实现,包括数据结构,控制结构,适配器等,如Filter/Pipe,Bind,And/Or/Not,WhileDo/IfElse等
-
基于这些结构和适配器,以function的形式实现了使用方便和可读性好的包装,如pipe,bind,and/or/not, ifelse等
三,用法
附带的测试用例可用来简单说明一下用法;其实所有functor和algorithm都很直观,看到名称和参数,即能领会它的用法;并且代码量非常少,半个小时就能将所有代码浏览一遍
曾经听说ThoughtWorks的敏捷项目中平均每个函数代码控制在三行以下,Gavator中每个函数平均只有不到两行代码
|
四,扩展
使用者可以在Gavator结构的任何一次层次对Gavator进行扩充,如扩充functor实现其它设计模式和常用概念,或编写更多的算法,结合import static,提高客户代码的可读性
目前Gavator to be contributed的是 ContinuationFramework 和 QueryFramework
五,问题
-
Gavator的主要思想来自C++ STL和Apache Common Funtor,我对纯粹的函数式语言如Scheme,Haskell并没有太多经验,因此Gavator最主要的问题是:它做的是否正确?
-
Gavator还不完整,如尚未将Functor实现为值语义等
-
好的名称有助于减少文档,促进理解,但同一个概念在不同的社团可能有不同的惯用名称,如transform和map,select和filter,accumulate和reduce,等等;Gavator选择了使用STL和Apache Common Functor中的名称
-
序列操作的参数应该是Collection还是Iterator ?STL和Apache Common Functor选择了Iterator,我感觉大部分情况下Collection更方便,就用了Collection
-
目前Gavator其实并不是很实用,像ifelse等基本是花拳绣腿,关键是要基于Gavator,发展出专注于某个应用领域的framework,如Continuation和Query
六、其它
Java语言本身的简单,造成了对Functional Programming支持的限制,Apache Common Functor至今还是sandbox;这些限制包括:
-
函数不是first class,不是一等公民,更别提lambda表达式
-
primitive type与class无法完全统一,你试试能否写一个通用的accumulate支持int集合,long集合,double集合的累加就知道了
-
不支持操作符重载,当然,这不是本质问题
-
使用擦拭法实现generic,使你不能对T调用任意函数,无法特化,没有typedef,只能用继承来模拟,任何动态特性都将使generic丧失类型安全性,如序列化后反序列化,反射等
-
甚至不能return void,这使Procedure和Function在实现上无法统一以减少代码,虽然在概念上它们是独立的
或许Java平台上的函数式编程的支持将使用专门的语言来解决
Gavator起源于去年的一个项目,在那个项目里实现了一个基于Functor的查询框架,增加一种条件只需实现Condition接口,当然,Condition是一个Predicate,然后就可以和已有的各种Condition通过and,or,not等组合出各种复合查询,提供服务的一方通过恒定不变的代码select(Collection, Condition)来满足任意的查询;希望接下来实现一个封装了各种查询(对象,SQL,XPath/XQuery等)的QueryFramework
另外对Continuation的支持也值得一做,希望得到帮助,mailto:ajaxchelsea@163.com
发表评论
-
The Object Primer
2004-12-11 11:21 5951,书名 被翻译成“ ... -
错误处理规范
2004-12-11 16:47 760错误处理规范 〇、概念澄清 概念 解释 错误 ... -
Java,误解为何如此之深
2005-08-24 13:50 596前几天被电话面试,问J ... -
Java:画蛇添足的编码规范
2005-09-02 13:13 624前几天公司培训编码规范: 第n条: ... -
synchronized : 规则, 推论与实践
2007-07-23 22:32 47314.3.Synchronization. Rule ... -
交互设计: 股市帮凶
2008-05-04 21:30 649同事 Y 在线操作股票时, 把"买入"点成 ... -
交互设计: 火车上的厕所
2008-05-26 17:17 614有人在动车组的厕所前等了很久, 直到乘务员路过说厕所是被锁住了 ... -
设计原则与模式: 案例介绍--CppUnit
2008-06-01 20:15 635设计原则与模式: 案例介绍--CppUnit CppUnit ... -
工作流:形参,实参,相关数据
2004-12-11 11:40 678关于形参,实参,相关数据 一、形参(FormalParame ... -
工作流:第一次发版,过程总结
2004-12-11 11:42 714交流 即时讨论:小组成员咫尺之遥,有问题立即提出并解决 ... -
工作流:第一次发版,设计总结
2004-12-11 11:43 614整体 面向接口:消息系统,持久系统等,其实现都是可替换 ... -
Beyond Workflow : An Introduction to Vitria BusinessWare
2005-09-26 10:13 807一、简介 Busines ... -
Vitria BusinessWare: 存储与访问安全
2006-03-26 15:45 755事实上,BusinessWare使用LDAP做为存储机制和 ... -
Vitria BusinessWare: 平台与软件总线
2006-04-01 12:59 853经过一段时间的使用 ... -
Vitria BusinessWare: Web Services
2006-04-01 14:30 744BusinessWare的Web Services ... -
Web Services:自洽,编码,交换模型
2006-04-01 16:02 6891, 自洽 以前曾经写过: 目前WebServi ... -
Web Services:WSDL 1.1 规范中的几个错误
2006-04-01 16:40 730读完了WSDL 1.1的规范,令人惊讶的是发现似乎例子中有几个 ... -
C++/CLI:被忽视的集成技术
2006-05-17 20:02 760十几行代码,就使一个重要的旧系统组件,完全融入了基于.Ne ... -
AJP/JK:异构Web平台的集成技术
2006-05-25 21:44 713Tomcat Connector 可以将Tomcat ... -
Vitria BusinessWare: 事件与端口
2006-05-27 17:24 677Event BusinessWare是一个事件驱动的系统 ...
相关推荐
Functor是一个具有operator()成员函数的类,这个函数使得类的实例可以像一个函数一样被调用。例如: ```cpp class MyFunctor { public: int memberVar; // operator() 定义了调用行为 int operator()(int arg)...
比如在利用SDK 进行Windows编程的时候,我们需要注册一个WNDCLASS类,这个类中有这样一个参数 lpfnWndProc, 要进行消息处理,我们就要用处理消息的函数的指针给它赋值。消息处理函数什么时候被调用的?我们没有显式地在...
动机作为Java SE 7的内置功能,缺少函子(或函数对象),建议的回调方法是使用接口。 Lambda和直接方法引用是仅SE 8的功能。解决方案从SE 7开始,Method类可用,它可以反映类实例方法: import java.lang.reflect....
MATLAB的functor机制还支持方法重载,这意味着我们可以为同一个方法定义多个版本,根据输入参数的不同选择执行哪一个。这可以进一步增强functor的灵活性和适用性。 总的来说,MATLAB的functor是面向对象编程的一个...
Functor 是一个带注释的函数(即具有命名输入和输出参数的 function_handle)。 使用 functor.compose 和/或 functor.combine 可以将函子的集合自动组合成新的函子我有时发现这对重构、调试和设计更大的程序很有用。...
函数对象(functor)是具有`operator()`的类,它表现得像一个函数,但具备类的所有优点,如封装数据、重载操作符和继承。这使得函数对象成为实现策略模式或函数式编程风格的理想选择: ```cpp class AddFunctor { ...
functor.map { it * 2 } // 应用一个函数到集合的每个元素上 ``` 除了上述功能,`kategory`还包含许多其他实用工具,如Monoid(表示可结合的运算)、Monad(用于组合计算)以及Applicative Functor(在纯上下文中...
Functor Law #2 (Composition): fmap (f . g) = fmap f . fmap g Applicative Functor Law #1 (Identity): pure id <*> x = x Applicative Functor Law #2 (Homomorphism): pure f <*> pure x =
另一种方式是定义一个函数对象(functor),如`lessThan`类,它重载了`operator()`,实现了相同的比较逻辑。 为了使泛型算法能够接受函数指针或函数对象作为参数,可以使用模板。例如,课件中展示了如何设计一个名...
所以对于 Ruby,我们将 Functor 定义为一个高阶函数。 本质上,函子可以根据应用于它的操作来改变其行为。 考虑以下简单示例。 f = Functor.new { |op, x| x.send(op, x) } f + 1 #=> 2 f + 2 #=> 4 f + 3 #=> 6 ...
因此,在该库中实现了其中的一部分: Functor , Applicative , Monad , Alternative等。 及其实例,例如Maybe , Either , [] , NonEmpty等。 建筑图书馆 可以使用Maven构建项目: $ mvn清洁包装 压缩的.jar...
在Haskell这门纯函数式编程语言中,通用遍历(Generic Traversal)是一个非常重要的概念,它允许程序员以统一的方式处理各种复杂的数据结构。这个主题通常与类型类(Type Classes)和类型家族(Type Families)相...
成员函数指针与functor之间的联系在于,functor有时可以用来模拟成员函数指针的行为,尤其是当需要一个可重用的、可存储的或可比较的“函数”时。成员函数指针只能指向特定类的成员,而functor可以更灵活,因为它是...
7.1.0-RC2是这个版本的候选发布2,意味着它是正式版本前的最后一个测试版。 描述中的"jdk_contract_tests.zip"是另一个压缩包,包含了对JDK接口的契约测试。这些测试基于JUnit 4,一个广泛使用的Java单元测试框架。...
QuickFunctor是一个C++库,专门用于实现Functor或“函数对象”。在C++中,Functor是一种可以被调用的类,它通过重载`operator()`来模拟函数的行为。这个开源库旨在扩展和增强C++标准库中提供的功能,为开发者提供了...
首先,让我们从基础开始,Applicative仿函数(Applicative Functor)是Haskell中的一个类型类,它是Functor的扩展,提供了一种组合计算的结构化方式。Applicative接口提供了`pure`和`(<*>)`等操作,使得我们可以对值...
在C++中,函子(Functor)本质上是一个可以被调用的对象,通常是重载了操作符()的类。函子提供了一种将行为封装到类中的方法,这样我们就可以像使用函数一样使用这些类,同时还能享受到面向对象编程带来的好处,如...
【标题】"Scalaz-core_2.10.0-M7-6.0.4.zip" 提供的是Scalaz库的一个特定版本,该库是Scala编程语言的一个扩展,专注于函数式编程和类型系统增强。Scalaz是"Scala library for functional programming and category ...
在Scala中,Functor通常指的是一个可以应用函数到容器中每个元素并返回一个相同类型容器的类型类。Scalaz提供了Functor类型类,它抽象化了map操作,这意味着任何可以提供map操作的类型都可以被当作Functor使用。通过...