为什么值类仅限于AnyVal?

Bas*_*ian 4 haskell scala wrapper primitive-types newtype

据我明白Scala中值类只是有包裹原始类型像IntBoolean为另一种类型,而不会引入额外的内存使用情况.因此它们基本上被用作普通类的轻量级替代品.

这让我想起了Haskell的newtype符号,它也用于将现有类型包装在新的类型中,因此在不消耗额外空间的情况下为某些数据引入了新接口(为了看到两种语言的相似性,例如考虑对一个"构造函数"的限制)HaskellScala中的字段).

我想知道为什么引入由编译器内联的新类型的概念并不是推广到Haskell为任何类型的类型提供零开销类型包装器的方法.为什么Scala家伙坚持原始类型(又名AnyVal)?

或者Scala中是否还有一种方法可以为Scala.AnyRef类型定义这样的包装器?

Rex*_*err 12

他们不限于此AnyVal.

implicit class RichOptionPair[A,B](val o: Option[(A,B)]) extends AnyVal {
  def ofold[C](f: (A,B) => C) = o map { case (a,b) => f(a,b) }
}

scala> Some("fish",5).ofold(_ * _)
res0: Option[String] = Some(fishfishfishfishfish)
Run Code Online (Sandbox Code Playgroud)

值类有各种限制,使它们像轻量级包装器一样,但只能包装基元不是其中之一.