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 中的新类型的主要内容,如果未能解决你的问题,请参考以下文章
Algebraic Data Type 及其在 Haskell 和 Scala 中的表现
翻译/编码 Haskell 的 `data Obj = forall a. (显示 a)=> Scala 中的 Obj a`