c# - Java/C#类型系统有哪些不足?

标签 c# java haskell type-systems

经常听说 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)。

如果您真的想了解更多信息,可以使用两个出色的在线资源:

Learn you a HaskellReal World Haskell

关于c# - Java/C#类型系统有哪些不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884391/

相关文章:

haskell - 什么是MACID?

Haskell 类型声明解释折叠?

c# - 执行数据读取器时索引超出范围

c# - 从 C# 运行 Microsoft.Build.Evaluation.Project 的并行构建

c# - gRPC 拦截 C# 中的调用

java - java中的嵌套接口(interface)

haskell - 读取实例导致解析错误

c# - EF Core 迁移不会获取所有属性

java - 确保缓存自行获取值的线程安全

java - Play Framework 2.1 无法处理来自 Controller 的 JSON POST 请求