在Java 6中可以表达monad的一般情况吗?

在Java 6中可以表达monad的一般情况吗? 请注意“一般情况”一词 - monad的一般情况可能是不可表达的,尽管monad的许多特定情况(即许多特定的monad)都是可以表达的。

这里的问题是(缺少)Java中更高级的泛型; 然而,我看到示例Haskell代码是真正使用像https://stackoverflow.com/a/877036/1123502(即public class Fix<F extends Fix<F>> )的方法移植到Java的。

当然,非类型安全的实现(比如使用Object和downcasts)并不有趣。

更新:有2个常见的monad定义:join-fmap和bind-return。 虽然它们在数学上是等价的,但它们可能并不等价,因为一个定义可以用Java来表达,而另一个定义则不是(然而,在我看来,非等价性不太可能)。 所以我的问题涉及两个定义。

底线:是否有人克服了所有障碍,并在Java 6中写下了“一般情况下”monad? 或者,或者,请指出一篇论文或一篇完整的博客文章,或者彻底解释为什么这是不可能的。


不是没有肮脏的铸造技巧。 正如你已经注意到的,Java不支持类型级多态(在斯卡拉土地中称为“更高级的类型”)。

这是一种方法:假设你想实现一个仿函数。 你想编写Functor<F<A>> ,其中F是例如ListMaybe ,但这不起作用。 但是你可以有一个“基类” Base<X,Y>用于更高级的东西。 X必须是您的真实课程“目击者”,如ListY是通常的通用参数。 现在你的函子变成了Functor<Base<F,A>> ,但所有想用这个的类都需要实现Base<X,Y>

class List<A> implements Base<List.Witness,A> {
   public class Witness{}
   ...
}

public interface Functor<F> {
    public <A, B> Base<F, B> map(F1<A, B> fn, Base<F, A> nestedA);
}

public class ListFunctor implements Functor<List.Witness> {
    public <A, B> Base<List.Witness, B> map(F1<A, B> fn, Base<List.Witness, A> nestedA) {
       ...
    }  
}

当然,付出的代价是你得到一个Base<List.Witness,B> ,而不是List<B> 。 如果你留在这个更高级的域名中,这可能没什么问题,当然你可以有方便的转换功能,但它仍然不是很好。

有关实现,请参阅我不那么认真的项目highJ。 请注意,我正在研究一个完全重写的稍微更方便的版本,它更接近上述示例。

对于严重的代码,可以考虑在Scala中写这些东西(或者使用Scalaz)。

链接地址: http://www.djcxy.com/p/67325.html

上一篇: Is general case of monad expressible in java 6?

下一篇: Return value for a << operator function of a custom string class in C++