有一个用 Tags.MinVal 标记的事物的半群,它选择最小 val:
scala> import scalaz._ ; import Scalaz._ ; import Tags._
import scalaz._
import Scalaz._
import Tags._
scala> MinVal(3).some |+| MinVal(1).some
res0: Option[scalaz.@@[Int,scalaz.Tags.MinVal]] = Some(1)
scala> MinVal(3).some |+| none[Int @@ MinVal]
res1: Option[scalaz.@@[Int,scalaz.Tags.MinVal]] = Some(3)
scala> none[Int @@ MinVal] |+| none[Int @@ MinVal]
res2: Option[scalaz.@@[Int,scalaz.Tags.MinVal]] = None
在上面,Int @@ MinVal
是一个类型,它是 的子类型Int
,它已经被“标记”了MinVal
,这有助于选择正确的半群。 MinVal(x: Int)
返回 x 的类型Int @@ MinVal
。 x.some
就像,Some(x)
除了类型是Option
代替Some
,这有助于类型推断(对于 Option 有一个 Semigroup,但对于 Some 没有),类似地none[T]
返回None
,但它的类型是Option[T]
而不是None
(出于同样的原因有帮助,没有 Semigroup无,但有一个选项)
如果有两个以上,也许您有这些列表,您可以使用suml
:
scala> List(MinVal(2).some, None, MinVal(3).some, None, MinVal(1).some).suml
res5: Option[scalaz.@@[Int,scalaz.Tags.MinVal]] = Some(1)