经常听说 Haskell(我不知道)有一个非常有趣的类型系统。我对 Java 非常熟悉,对 C# 也有一点了解,但有时我会与类型系统作斗争,所以一些设计适应或以某种方式更好地工作。
这让我想知道......
Java/C#类型系统的不足会导致哪些问题? 你如何处理它们?
最佳答案
数组被破坏了。
Object[] foo = new String[1];
foo[0] = new Integer(4);
给你 java.lang.ArrayStoreException
谨慎对待它们。
可空性是另一个大问题。 NullPointerExceptions 无处不在。除了切换语言或使用尽可能避免它们的约定(正确初始化字段等)之外,您真的无法对它们做任何事情。
更一般地说,Java/C# 的类型系统不是很有表现力。 Haskell 能给你的最重要的事情是,通过它的类型,你可以强制函数没有副作用。编译时证明部分程序只是被评估的表达式,这使得程序更加可靠、可组合且更易于推理。 (忽略这个事实,Haskell 的实现为您提供了绕过它的方法)。
将其与 Java 进行比较,在 Java 中调用方法几乎可以做任何事情!
Haskell 也有模式匹配,这给了你不同的方式来创建程序;你有关于哪些功能运行的数据,通常是递归的。在模式匹配中,您破坏数据以查看它是什么类型,并根据它进行操作。例如你有一个列表,它要么是空的,要么是头和尾。如果你想计算长度,你定义一个函数说:如果列表为空,length = 0,否则 length = 1 + length(tail)。
如果您真的想了解更多信息,可以使用两个出色的在线资源:
关于c# - Java/C#类型系统有哪些不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884391/