簡體   English   中英

Scalaz中的標記類型(@@)比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM