Haskell 在 Scala 中的新类型

Posted

技术标签:

【中文标题】Haskell 在 Scala 中的新类型【英文标题】:Haskell's newtypes in Scala 【发布时间】:2022-01-24 00:48:26 【问题描述】:

在 Haskell 中,我们可以声明新类型以减少动态内存分配并创建类型安全的 API。

newtype Username String = Username String
  deriving (Eq, Ord)

newtype 仅适用于具有单个构造函数和单个参数的数据类型。 Scala中有没有类似newtype的东西?

例子:

case class Username(username: String)

对于用户名,我们可以在 Scala 中这样写:

newtype Username(username: String)

【问题讨论】:

哪个 Scala 版本? 【参考方案1】:

等效于 Haskell 的 newtype 是 Scala 3 中的 Opaque Type Aliases

opaque type Username = String

它基本上是一个type 别名……但不透明。就像封面上说的那样。

【讨论】:

值得一提的是,在 Scala 2 中我们可以使用这个库:github.com/estatico/scala-newtype? Scala 2 中也有值类,不是吗? @GaëlJ 考虑到它们的局限性和令人惊讶的行为,我不建议将它们用于新类型建模。 @LuisMiguelMejíaSuárez:我假装 Scala 2 不再存在。使整个过渡更加顺畅:没有过渡:-D @GaëlJ:我不认为值类是不透明的类型包装器。它们是用户定义的值类型(Java 中的“原语”)。不同的用例。

以上是关于Haskell 在 Scala 中的新类型的主要内容,如果未能解决你的问题,请参考以下文章

Haskell趣学指南

工具rest:Haskell的REST开源框架

Scala中的Haskell“forall”翻译

安全执行不受信任的 Haskell 代码

Algebraic Data Type 及其在 Haskell 和 Scala 中的表现

翻译/编码 Haskell 的 `data Obj = forall a. (显示 a)=> Scala 中的 Obj a`