`
chelsea
  • 浏览: 119380 次
  • 来自: ...
社区版块
存档分类
最新评论

Generic Java Functor 发布首个版本

    博客分类:
 
阅读更多

 

〇,简介

Gavator(Generic Java Functor)试图探索以普通Java语法进行函数式编程的可行性,并尽可能的保证使用的方便性,良好的可读性和基本的类型安全性

一,功能

所有功能都是类型安全的,无需涉及强制转型

  • 提供了若干算法: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中每个函数平均只有不到两行代码

package gavator.test;

import static gavator.algorithm.Algorithms.*;

import gavator.datastructure.*;

import junit.framework.*;

 

class ToUpperFilter implements Filter<String> {

public String eval(String obj) {

return obj.toUpperCase();

}

}

class ToLowerFilter implements Filter<String> {

public String eval(String obj) {

return obj.toLowerCase();

}

}

class DirtyWordsFilter implements Filter<String> {

public String eval(String obj) {

return obj.replace("dirty words", "***");

}

}

 

public class FilterPipeTest extends TestCase {

 

private Pipe lowerPipe, upperPipe, dirtyWordsPipe;

private String string = "abc";

private String dws = "you said dirty words, so...";

 

public void testFilter() {

Assert.assertEquals("ABC", new ToUpperFilter().eval(string));

Assert.assertEquals("abc", new ToLowerFilter().eval(new ToUpperFilter().eval(string)));

Assert.assertEquals("you said ***, so...", new DirtyWordsFilter().eval(dws));

}

public void testPipe() {

lowerPipe = new Pipe<String>(new ToUpperFilter(), new ToLowerFilter());

upperPipe = new Pipe<String>(new ToLowerFilter(), new ToUpperFilter());

dirtyWordsPipe = new Pipe<String>(lowerPipe, new DirtyWordsFilter());

 

Assert.assertEquals("abc", lowerPipe.eval("abc"));

Assert.assertEquals("ABC", upperPipe.eval("abc"));

 

Assert.assertEquals("hehe***", dirtyWordsPipe.eval("hehedirty words"));

Assert.assertEquals("hehe***", pipe("hehedirty words", dirtyWordsPipe));

}

}

四,扩展

使用者可以在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

 

分享到:
评论

相关推荐

    c++的Functor修正版

    Functor是一个具有operator()成员函数的类,这个函数使得类的实例可以像一个函数一样被调用。例如: ```cpp class MyFunctor { public: int memberVar; // operator() 定义了调用行为 int operator()(int arg)...

    Java中的functor实现

    比如在利用SDK 进行Windows编程的时候,我们需要注册一个WNDCLASS类,这个类中有这样一个参数 lpfnWndProc, 要进行消息处理,我们就要用处理消息的函数的指针给它赋值。消息处理函数什么时候被调用的?我们没有显式地在...

    JavaFunctors:Java SE 7中的Functor实现

    动机作为Java SE 7的内置功能,缺少函子(或函数对象),建议的回调方法是使用接口。 Lambda和直接方法引用是仅SE 8的功能。解决方案从SE 7开始,Method类可用,它可以反映类实例方法: import java.lang.reflect....

    matlab开发-functor

    MATLAB的functor机制还支持方法重载,这意味着我们可以为同一个方法定义多个版本,根据输入参数的不同选择执行哪一个。这可以进一步增强functor的灵活性和适用性。 总的来说,MATLAB的functor是面向对象编程的一个...

    functor:函数句柄的自动组合-matlab开发

    Functor 是一个带注释的函数(即具有命名输入和输出参数的 function_handle)。 使用 functor.compose 和/或 functor.combine 可以将函子的集合自动组合成新的函子我有时发现这对重构、调试和设计更大的程序很有用。...

    函数调用扩展_函数扩展_raysfrs_函数入口地址_functor_虚函数_

    函数对象(functor)是具有`operator()`的类,它表现得像一个函数,但具备类的所有优点,如封装数据、重载操作符和继承。这使得函数对象成为实现策略模式或函数式编程风格的理想选择: ```cpp class AddFunctor { ...

    kategory,kotlin的函数数据类型和抽象.zip

    functor.map { it * 2 } // 应用一个函数到集合的每个元素上 ``` 除了上述功能,`kategory`还包含许多其他实用工具,如Monoid(表示可结合的运算)、Monad(用于组合计算)以及Applicative Functor(在纯上下文中...

    functor-applicative-and-monad-laws:在 JavaScript 中实现的 Functor、Applicative Functor 和 Monad 定律

    Functor Law #2 (Composition): fmap (f . g) = fmap f . fmap g Applicative Functor Law #1 (Identity): pure id &lt;*&gt; x = x Applicative Functor Law #2 (Homomorphism): pure f &lt;*&gt; pure x =

    面向对象程序设计英文教学课件:13-Design-Generic-Algorithm.pptx

    另一种方式是定义一个函数对象(functor),如`lessThan`类,它重载了`operator()`,实现了相同的比较逻辑。 为了使泛型算法能够接受函数指针或函数对象作为参数,可以使用模板。例如,课件中展示了如何设计一个名...

    functor:Ruby 的高阶函数

    所以对于 Ruby,我们将 Functor 定义为一个高阶函数。 本质上,函子可以根据应用于它的操作来改变其行为。 考虑以下简单示例。 f = Functor.new { |op, x| x.send(op, x) } f + 1 #=&gt; 2 f + 2 #=&gt; 4 f + 3 #=&gt; 6 ...

    Functional-Java:Java中的函数式编程风格

    因此,在该库中实现了其中的一部分: Functor , Applicative , Monad , Alternative等。 及其实例,例如Maybe , Either , [] , NonEmpty等。 建筑图书馆 可以使用Maven构建项目: $ mvn清洁包装 压缩的.jar...

    generic-traversal:Haskell中任意数据结构的通用遍历

    在Haskell这门纯函数式编程语言中,通用遍历(Generic Traversal)是一个非常重要的概念,它允许程序员以统一的方式处理各种复杂的数据结构。这个主题通常与类型类(Type Classes)和类型家族(Type Families)相...

    c++ 成员函数指针

    成员函数指针与functor之间的联系在于,functor有时可以用来模拟成员函数指针的行为,尤其是当需要一个可重用的、可存储的或可比较的“函数”时。成员函数指针只能指向特定类的成员,而functor可以更灵活,因为它是...

    scalaz-concurrent_sjs0.5_2.10-7.1.0-RC2.zip

    7.1.0-RC2是这个版本的候选发布2,意味着它是正式版本前的最后一个测试版。 描述中的"jdk_contract_tests.zip"是另一个压缩包,包含了对JDK接口的契约测试。这些测试基于JUnit 4,一个广泛使用的Java单元测试框架。...

    QuickFunctor (C++ Functor Library)-开源

    QuickFunctor是一个C++库,专门用于实现Functor或“函数对象”。在C++中,Functor是一种可以被调用的类,它通过重载`operator()`来模拟函数的行为。这个开源库旨在扩展和增强C++标准库中提供的功能,为开发者提供了...

    验证选择:基于Applicative和Selective仿函数的轻量级纯验证

    首先,让我们从基础开始,Applicative仿函数(Applicative Functor)是Haskell中的一个类型类,它是Functor的扩展,提供了一种组合计算的结构化方式。Applicative接口提供了`pure`和`(&lt;*&gt;)`等操作,使得我们可以对值...

    AutoFunctor: C++ Automatic Functors.-开源

    在C++中,函子(Functor)本质上是一个可以被调用的对象,通常是重载了操作符()的类。函子提供了一种将行为封装到类中的方法,这样我们就可以像使用函数一样使用这些类,同时还能享受到面向对象编程带来的好处,如...

    scalaz-core_2.10.0-M7-6.0.4.zip

    【标题】"Scalaz-core_2.10.0-M7-6.0.4.zip" 提供的是Scalaz库的一个特定版本,该库是Scala编程语言的一个扩展,专注于函数式编程和类型系统增强。Scalaz是"Scala library for functional programming and category ...

    scala函数式编程-scalaz

    在Scala中,Functor通常指的是一个可以应用函数到容器中每个元素并返回一个相同类型容器的类型类。Scalaz提供了Functor类型类,它抽象化了map操作,这意味着任何可以提供map操作的类型都可以被当作Functor使用。通过...

Global site tag (gtag.js) - Google Analytics