Scalaz === on Some

3

在scalaz中理解 === 行为的难度

1. scala> 1.some === Some(1)
   res33: Boolean = true

2. scala> Some(1) === 1.some
   <console>:14: error: value === is not a member of Some[Int]
              Some(1) === 1.some
                      ^

3. scala> (Some(1):Option[Int]) === 1.some
   res35: Boolean = true

我可以理解(1),甚至期望(2)会得到相同的结果。

在(3)中,我不得不将Some转换为Option才能得到结果。

我查看了scalaz的源代码,但无法理解。

请解释一下。

Scalaz版本=7.1.0

Scala版本=2.11.2


1
似乎与Scala版本有关。在Scala 2.10.4下按预期工作。 - Ionuț G. Stan
@IonuțG.Stan 噢,它在Scala 2.10.4上运行良好。那么这可能是Scalaz的一个错误吗? - manu
1个回答

4
Some(1)返回的是Some[Int]而不是Option[Int].some的整个意义在于返回Option[Int],以更加兼容scalaz风格。Scalaz是为非子类型化的ADT编程风格编写的,并且大多数scalaz类型类对子类型化的支持非常少(特别是它们通常是不变的;尽管这经常改善类型推断并意味着当用户犯错误时会有更好的错误消息,但代价是对子类型的支持较差)。如果您经常使用scalaz,您可能会发现始终使用像.some这样的scalaz风格的“智能构造函数”最容易。

我看到一些不变的类型类,这会减少一些灵活性。但是正如@IonuțG.Stan所指出的那样,它可以在scala 2.10.4中工作。这可能是scalaz进行交叉编译时出现的问题吗? - manu
我不知道,我的观点更多的是Scalaz不支持这种使用风格,并且很可能不认为这是一个错误。 - lmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接