ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

monad的一般情况是否在java 6中可以表达?

2019-05-20 15:48:35  阅读:246  来源: 互联网

标签:java haskell monads higher-kinded-types generics


Java 6中是否可以表达monad的一般情况?注意单词“一般情况” – monad的一般情况可能是不可表达的,尽管monad(即许多特定monad)的许多特定情况是可表达的.

这里的问题是(缺乏)Higher-kinded generics in Java;但是,我看到样本Haskell代码实际上是使用像https://stackoverflow.com/a/877036/1123502这样的方法移植到Java(即公共类Fix< F extends Fix< F>>).

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

更新:有两个常见的monad定义:join-fmap和bind-return.虽然它们(数学上)是等价的,但它们可能不等同于一个定义在Java中可表达,而其他定义则不然(但在我看来,非等价是不可能的).所以我的问题涉及两个定义.

底线:是否有人克服了所有障碍并在Java 6中编写了“一般案例”monad?或者,或者,请指出一篇论文或一篇全面的博客文章,或彻底解释为什么不可能.

解决方法:

不是没有肮脏的铸造技巧.正如您已经注意到的,Java不支持类型级别多态性(在Scala土地中是a.k.a.“更高级的类型”).

这是一种方式:假设您想要实现一个仿函数.你想写Functor< F< A>>,其中F是例如列表或可能,但这不起作用.但是你可以有一个“基类”Base< X,Y>对于更高级的东西. X必须是像List这样的真实类的“见证”. Y是通常的通用参数.现在您的仿函数变为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).

标签:java,haskell,monads,higher-kinded-types,generics
来源: https://codeday.me/bug/20190520/1144081.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有