我跟随https://stackoverflow.com/users/4395383/ujjwal-kumar。
我收到了以下代码
sealed trait Bool {
type && [b <: Bool] <: Bool
type || [b <: Bool] <: Bool
type IfThenElse[B, T <: B, F <: B] <: B
}
object True extends Bool {
type && [B <: Bool] = B
type || [B <: Bool] = True.type
type IfThenElse[B, T <: B, F <: B] = T
}
object False extends Bool {
type && [B <: Bool] = False.type
type || [B <: Bool] = B
type IfThenElse[B, T <: B, F <: B] = F
}
type True = True.type
type False = False.type
当我尝试运行测试时
assert((False && False) == False)
我收到了消息
Error:(26, 16) value && is not a member of object A$A146.this.False
assert((False && False) == False)
^
有人能告诉我那个代码有什么问题吗?我正在运行代码 a * .sc文件。 (我真的是Scala的新手)
答案 0 :(得分:5)
有两个问题。
首先,您无法将类型与值进行比较。 ==
是一个运行时方法,因此即使它起作用,也会破坏在类型级别执行操作的目的。您可以做的是查找A =:= B
,A <: Bool
和B <: Bool
的隐含证据。
其次,您不能对类型成员使用中缀表示法,因此False && False
必须写为False.&&[False]
。至少在你定义它的方式。只有在定义为具有两个参数的类型(如type &&[A, B]
现在我们尝试尝试一些计算。以下是一些成功解决的问题:
scala> implicitly[False.&&[False] =:= False]
res9: =:=[False.&&[False],False] = <function1>
scala> implicitly[False.&&[False] =:= False]
res12: =:=[False.&&[False],False] = <function1>
scala> implicitly[False.&&[True] =:= False]
res13: =:=[False.&&[True],False] = <function1>
scala> implicitly[True.&&[False] =:= False]
res15: =:=[True.&&[False],False] = <function1>
scala> implicitly[True.||[False] =:= True]
res17: =:=[True.||[False],True] = <function1>
有些不这样做:
scala> implicitly[False.&&[False] =:= True]
<console>:20: error: Cannot prove that False.&&[False] =:= True.
implicitly[False.&&[False] =:= True]
^
scala> implicitly[(False && False) =:= True]
<console>:20: error: not found: type &&
implicitly[(False && False) =:= True]
^
scala> implicitly[True.||[False] =:= False]
<console>:19: error: Cannot prove that True.||[False] =:= False.
implicitly[True.||[False] =:= False]
^
scala> implicitly[True.&&[True] =:= False]
<console>:20: error: Cannot prove that True.&&[True] =:= False.
implicitly[True.&&[True] =:= False]
^