3

我正在研究 Haskell 并遇到了polymorphic values。这些是根据上下文具有不同类型的值。例如,Nothing有类型Maybe a[]有类型[a][]你想要的任何东西的列表也是如此,你可以在任何需要列表的地方使用它。

我很难在 Java 中找到类似的东西,除了“十亿美元的错误” null,它基本上是任何类型的。可能与无界通配符的泛型类似,但同样,我想不出一个例子。

Java中有类似的东西吗?

4

2 回答 2

7

这更像是评论而不是实际答案,但我需要更多空间。

虽然 Java 和 Haskell 的类型系统大相径庭,但在某些特性中可以找到一些相似之处。这里有几个例子:请记住,下面显示的相关结构之间没有完美的对应关系。

多态函数(如 FP,而不是 OOP 多态):

fst :: forall a b. (a, b) -> a
fst (x,y) = x
<A,B> A fst(A a, B b) {
    return a;
}

请注意,多态非函数值不能轻易翻译。即使在 Haskell 中,诸如此类的值3 :: Num a => a也是伪装的函数。此外,[] :: [a]并且Nothing :: Maybe a也被视为函数,在编译的某些阶段采用“类型”参数——尽管 IIRC 在运行时这些参数会消失。

类型参数:

data T a = T a Int a
class T<A> {
    A x;
    int n;
    A y;

    T(A x, int n, A y) {
        this.x = x; this.n = n; this.y = y;
    }
}

代数数据类型(例如data具有许多构造函数):这些在 Java 中不直接可用。其他一些 JVM 语言,如 Scala,在语言中直接支持 ADT,以及模式修补和非详尽警告。在 Java 中,可以使用所谓的访问者模式来模拟 ADT 值消除,这是模式匹配的一种基本形式。

于 2016-01-19T21:29:11.720 回答
2

像这样的多态值[]只能表示为 Java 中的方法。事实上,这个方法已经存在于Arrays类中并被调用asList。由于 Java 的类型推断,您甚至不需要提供类型参数:

import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> myList = Arrays.asList();
    }
}

如果你忽略所有的噪音,[]Arrays.asList()

于 2016-01-19T20:42:56.880 回答