Scala 类型系统的优点

2024-03-05

我正在探索 Scala 语言。我经常听到的一个说法是 Scala 有一个stronger类型系统优于 Java。我认为人们的意思是:

  • scalac拒绝某些有缺陷的程序javac会愉快地编译,只会导致运行时错误。
  • 某些不变量可以在 Scala 程序中进行编码,这样编译器就不会让程序员编写违反条件的代码。

我这样想对吗?


Scala 类型系统的主要优点并不在于stronger而是远离richer (see "Scala 类型系统 https://web.archive.org/web/20110122231742/http://programming-scala.labs.oreilly.com/ch12.html").
(Java 可以定义其中一些,并实现其他一些,但 Scala 内置了它们)。
也可以看看, 评论史蒂夫·叶格的博客文章 http://steve-yegge.blogspot.com/2008/06/rhinos-and-tigers.html,他将 Scala“鄙视”为“弗兰肯斯坦的怪物”,因为“有类型类型,也有类型类型”。

  • 使用值类型类(对于具有值语义的相当小的数据结构很有用)而不是基元类型(Int、Double 等),并隐式转换为“Rich”类以获取其他方法。
  • 不可空类型 https://stackoverflow.com/questions/1522367/library-support-for-scalas-notnull-trait
  • 单子类型 http://debasishg.blogspot.com/2008/03/monads-another-way-to-abstract.html
  • 特质类型(以及混合成分 http://debasishg.blogspot.com/2006/04/scala-compose-classes-with-mixins.html随之而来的)
  • 单例对象类型(只需定义一个“对象”,您就拥有一个),
  • 复合类型 http://www.scala-lang.org/node/110(对象类型的交集,表示一个对象的类型是其他几种类型的子类型),
  • 功能类型 http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6 ((type1, …)=>returnType句法),
  • 案例类 http://www.scala-lang.org/node/107(常规类导出其构造函数参数并通过模式匹配提供递归分解机制),
  • 路径依赖类型 http://programming-scala.labs.oreilly.com/ch12.html#PathDependentTypes(允许嵌套类型的语言提供了引用这些类型路径的方法),
  • 匿名类型 http://www.scala-lang.org/node/133(用于定义匿名函数),
  • 自我类型 http://www.scala-lang.org/node/124(可例如在 Trait 中使用 http://markthomas.info/blog/?p=92),
  • 类型别名 http://davetron5000.github.com/scala-style/naming_conventions/type_aliases.html, 随着:
  • 封装对象 https://stackoverflow.com/questions/1605976/using-type-aliases-to-java-enums(2.8中引入)
  • Generic types http://www.scala-lang.org/node/113 (like Java), with a type parameter annotation mechanism http://www.scala-lang.org/node/129 to control the subtyping behavior of generic types,
    • 协变泛型类型:注释+T声明类型T仅用于协变位置。Stack[T]是一个子类型Stack[S] if T是一个子类型S.
    • 逆变泛型类型:-T会声明T仅用于逆变位置。
  • 有界泛型类型(尽管Java支持其中的一部分 https://stackoverflow.com/questions/1751275/are-there-any-plans-for-java-to-add-generic-collection-covariance),
  • 高等种类 https://blogs.atlassian.com/2013/09/scala-types-of-a-higher-kind/,它允许表达比 Java 泛型更高级的类型关系,
  • 抽象类型 http://www.scala-lang.org/node/105(泛型类型的替代),
  • 存在主义类型 https://stackoverflow.com/questions/292274/what-is-an-existential-type (used in Scala https://stackoverflow.com/questions/1031042/scalas-existential-types就像 Java 通配符类型),
  • 隐式类型 http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6 (see "Scala 的强大之处是显而易见的 http://technically.us/code/x/the-awesomeness-of-scala-is-implicit",
  • 查看有界类型 http://www.scala-lang.org/node/130, and
  • 结构类型 http://langexplr.blogspot.com/2007/07/structural-types-in-scala-260-rc1.html,用于通过指定所需类型的特征来指定类型(鸭子类型)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 类型系统的优点 的相关文章

随机推荐

  • 修复了 iframe 中 css 的垂直定位

    我试图让我的底部标题粘贴到 iframe 应用程序内屏幕的底部 并使其始终出现在用户的视图中 即使页面滚动时也是如此 我无法控制外部 iframe 因为它位于不同的域中 标头本身必须位于 iframe 内部 因为我无法控制 iframe 外
  • 在 C 中,为什么 const 变量不能用作数组大小初始值设定项? [复制]

    这个问题在这里已经有答案了 在下面的代码中 const int 不能用作数组大小 const int sz 0 typedef struct char s sz st int main st obj strcpy obj s hello w
  • 通过 Ajax 添加详细信息时出错

    你好frndz 我需要帮助 我正在尝试通过我的表单添加详细信息 但没有获得任何价值 并且错误反映为 添加请求失败 任何人都可以解决我的错误 我不知道该怎么做 这是我的代码webapp js Add company button docume
  • 我正在尝试使用 4 路循环展开来优化此 C 代码

    我想做的是获取此 C 代码并使用称为循环展开的技术对其进行优化 但在本例中我想使用四路循环展开 现在 我理解了这项技术 也理解了这个概念 但我只是不知道如何将其应用到这段代码中 我需要添加一些额外的变量吗 我是否必须在每个循环之后或所有循环
  • java.lang.IllegalArgumentException:如果指定的 JWT 是数字签名的,则必须指定签名密钥

    我正在寻求实施JWT在我的申请中 我正在通过参考以下内容进行一些研发 https stormpath com blog jwt java create verify https stormpath com blog jwt java cre
  • 使用自定义 http.ResponseWriter 根据代理请求的响应写入 cookie?

    我原来的问题here https stackoverflow com questions 58776775 how can i set a cookie based on response header with reverse proxy
  • 使用 Java 将十六进制转储的字符串表示形式转换为字节数组?

    我正在寻找一种将表示十六进制值的长字符串 来自转储 转换为字节数组的方法 我无法比发帖者更好地表达它同样的问题在这里 http www experts exchange com Programming Programming Languag
  • 使用方法初始化常量变量 (C#)

    是否可以使用另一个类的方法初始化常量值 namespace ConsoleApplication1 class Program const int gravit haha habc something like this static vo
  • 弹性盒/网格布局中的最后一个边距/填充折叠

    我有一个项目列表 我正在尝试使用 Flexbox 将其排列成可滚动的水平布局 容器中的每个项目都有左右边距 但最后一个项目的右边距正在折叠 有没有办法阻止这种情况发生 或者有一个好的解决方法 ul list style type none
  • Laravel 中使用 return 重定向到外部 URL

    我正在尝试使用 SMS INDIA HUB API 向用户发送一次性密码 为此 我需要重定向到 URL 格式 如果我们加载这个 URL 它将返回一些消息 我需要把这条消息传达给 我试过这样 url http cloud smsindiahu
  • 当我在分析模式下运行我的应用程序时,它停止响应

    我的 Android 应用程序在长时间运行的会话中遇到一些 OutOfMemory 错误 为了找到原因 我尝试使用 Android Studio Profiler 但它停止工作并在使用后 10 秒内冻结应用程序 这是 Android Stu
  • 如何在 URL 中传递 Javascript 变量?阿贾克斯

    我试图在我使用的 url 中传递 accesstoken 和 pageid 的值 有什么想法如何正确地做到这一点吗
  • 文档中哪里说 while 测试 readdir 的定义?

    也可以看看 readdir 的 0 结果在 while 条件下如何不为 false https stackoverflow com questions 843430 how is 0 result from readdir not fals
  • VarBinary 到图像 url

    我正在将 Base64 图像转换为byte 并将其存储在varbinarySQL Server 中的列 我想从数据库获取图像并将其设置为 ASP NET 的图像 urlimage 我怎样才能做到这一点 将图像写入数据库的代码 string
  • 在不同行上选择满足不同条件的值

    假设我有一个像这样的两列表格 userid roleid 1 1 1 2 1 3 2 1 我想获得所有不同的用户 IDroleids1 2 AND 3 使用上面的示例 我想要返回的唯一结果是userid1 我该怎么做 好吧 我对此投了反对票
  • 使用 wingrep 搜索 IP 地址

    我正在使用 WinGrep 在 txt 文件中搜索 IP 地址 但我不知道如何让它使用正则表达式进行搜索 有人对这个有经验么 如果您不需要考虑 IPv6 只需要没有端口号的数字 IP 地址 并且不需要验证地址 即不匹配非法地址行321 45
  • Spring MVC 控制器返回 HTML

    我在尝试将 HTML 返回到 Spring MVC 控制器时遇到问题 它看起来像这样 RequestMapping value QUESTION GROUP CREATE URL method RequestMethod POST publ
  • Node.js 上的多个服务器

    我需要在同一个 Nodejs 实例上模拟四个服务器 具有不同的主机和端口 一个例子可以是 域1 8000 域2 8010 域名3 8020 域4 8030 有人可以帮我吗 谢谢 我添加了一个示例 其中包含使用节点的 2 个服务器的可能解决方
  • Java 8 中的多个 null 检查

    我有下面的代码 对于多个空检查来说有点难看 String s null if str1 null s str1 else if str2 null s str2 else if str3 null s str3 else s str4 所以
  • Scala 类型系统的优点

    我正在探索 Scala 语言 我经常听到的一个说法是 Scala 有一个stronger类型系统优于 Java 我认为人们的意思是 scalac拒绝某些有缺陷的程序javac会愉快地编译 只会导致运行时错误 某些不变量可以在 Scala 程