Tag: monads

RxJava – 获取列表中的每个项目

我有一个返回Observable<ArrayList> ,它是一些Items的id。 我想通过这个列表并使用另一个返回Observable方法下载每个Item。 我如何使用RxJava运算符执行此操作?

Java 8中Optional类型的有效用法

这是Java 8中Optional类型的有效(预期)用法吗? class Foo { private final Integer id; private final String name; private final String countryCode; Foo(final Integer id, final String name, final String countryCode) { this.id = id; this.name = name; this. countryCode = countryCode; } public String getName() { return name; } public String getCountryCode() { return countryCode; } } class FooSrv […]

为什么Monad接口不能用Java声明?

在开始阅读之前:这个问题不是关于理解monad,而是关于识别Java类型系统的限制,这会限制Monad接口的声明。 在我努力理解monad的过程中,我读了Eric Lippert关于一个问题的问题,这个问题是关于monad的简单解释。 在那里,他还列出了可以在monad上执行的操作: 有一种方法可以获取非放大类型的值并将其转换为放大类型的值。 有一种方法可以将非放大类型的操作转换为符合之前提到的function组合规则的放大类型的操作 通常有一种方法可以将未放大的类型从放大类型中取出。 (对于monad来说,最后一点并不是绝对必要的,但通常存在这样的操作。) 在阅读了关于monads的更多信息后,我将第一个操作识别为return函数,将第二个操作识别为bind函数。 我无法找到第三个操作的常用名称,因此我将其称为unbox函数。 为了更好地理解monad,我继续尝试用Java声明一个通用的Monad接口。 为此,我首先看了上面三个函数的签名。 对于Monad M ,它看起来像这样: return :: T1 -> M bind :: M -> (T1 -> M) -> M unbox :: M -> T1 return函数不在M的实例上执行,因此它不属于Monad接口。 相反,它将实现为构造函数或工厂方法。 此外,我现在省略了接口声明中的unbox函数,因为它不是必需的。 对于接口的不同实现,将具有该function的不同实现。 因此, Monad接口仅包含bindfunction。 让我们尝试声明接口: public interface Monad { Monad bind(); } 有两个缺点: bind函数应返回具体实现,但它只返回接口类型。 这是一个问题,因为我们在具体的子类型上声明了unbox操作。 我将此称为问题1 。 bind函数应该bind函数检索为参数。 我们稍后会解决这个问题。 […]