gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:02:34 25 4
gpt4 key购买 nike

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

这里的问题是(缺少)Higher-kinded generics in Java ;然而,我看到示例 Haskell 代码确实使用类似 https://stackoverflow.com/a/877036/1123502 的方法移植到 Java 中。 (即 public class Fix<F extends Fix<F>> )。

当然,非类型安全的实现(例如使用对象和向下转型)并不有趣。

更新:有 2 个常见的 monad 定义:join-fmap 和 bind-return。尽管它们(在数学上)是等价的,但从某种意义上说它们可能不等价,即一个定义可以用 Java 表达,而其他定义则不能(但是,在我看来,不等价的可能性不大)。所以我的问题涉及这两个定义。

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

最佳答案

并非没有肮脏的选角技巧。正如您已经指出的那样,Java 不支持类型级多态性(在 Scala 中也称为“更高种类的类型”)。

这是一种方法:假设您想实现一个仿函数。您想写Functor<F<A>> ,其中F例如一个ListMaybe ,但这不起作用。但你可以有一个“基类”Base<X,Y>对于更高级的东西。 X必须是您真实类(class)的“见证人”,例如 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)。

关于java - monad 的一般情况可以在 java 6 中表达吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13552254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com