[英]Tagged Type (@@) Comparison in Scalaz
在玩Scalaz.Tag
,我發現比較奇怪的結果。
import scalaz._, Scalaz._, Tags._, syntax.tag._
test("Creating Tagged type") {
sealed trait USD
sealed trait EUR
def USD[A](amount: A): A @@ USD = Tag[A, USD](amount)
def EUR[A](amount: A): A @@ EUR = Tag[A, EUR](amount)
val oneUSD = USD(1)
2 * oneUSD.unwrap shouldBe 2
def convertUSDtoEUR[A](usd: A @@ USD, rate: A)
(implicit M: Monoid[A @@ Multiplication]): A @@ EUR =
EUR((Multiplication(usd.unwrap) |+| Multiplication(rate)).unwrap)
convertUSDtoEUR(USD(1), 2) === EUR(2) // true
convertUSDtoEUR(USD(1), 2) === USD(2) // true
convertUSDtoEUR(USD(1), 2) shouldBe EUR(2) // true
convertUSDtoEUR(USD(1), 2) shouldBe USD(2) // true
}
我想區分不同的密封特征。 這是scalaz.Tag
預期行為還是我錯過了什么?
更新
我實現了=:=
,因為由於org.scalactic.TripleEqualSupport
我無法在org.scalatest.FunSuite
使用scalaz ===
trait FunTestSuite
extends FunSuite
with Matchers
with BeforeAndAfterEach
with BeforeAndAfterAll
with TestImplicits
trait TestImplicits {
final case class StrictEqualOps[A](val a: A) {
def =:=(aa: A) = assert(a == aa)
def =/=(aa: A) = assert(!(a == aa))
}
implicit def toStrictEqualOps[A](a: A) = StrictEqualOps(a)
}
// spec
convertUSDtoEUR(USD(1), 2) =:= EUR(2)
convertUSDtoEUR(USD(1), 2) =:= EUR(3) // will fail
convertUSDtoEUR(USD(1), 2) =:= USD(3) // compile error
您正在使用===
並且shouldBe
來自scalatest。 他們只檢查運行時值,而不檢查類型(它們委托==
)。 如果要區分類型,則必須使用scalaz中的===
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.