sealed trait Process[+F[_], +O]
/**
* Created by pach on 11/07/14.
*/
package object stream {
type Process0[+O] = Process[Nothing,O]
...
}
这是 Process0 定义的方式。
实际上我无法理解为什么这会编译,因为Nothing
没有类型参数。
表示无效的流
为什么不将上下文类型 F 设置为值类型本身(使用标识类型构造函数
scalaz.Scalaz.Id
)。
type Process0[+O] = Process[Id, O]
答案 0 :(得分:1)
Scala编译器对Nothing
的处理方式与其他类型略有不同,例如同一技巧不适用于Null
,尽管它是所有引用类型的底部类型。您可以使用implicits
和特殊方法<:<
检查子类型关系,如下所示:
scala> implicitly[Nothing <:< List[_]]
res1: <:<[Nothing,List[_]] = <function1>
如果没有关系,你会看到:
scala> implicitly[Null <:< Int]
<console>:8: error: Cannot prove that Null <:< Int.
implicitly[Null <:< Int]
关于你的主要问题,我对scalaz-streams并不熟悉,但据我所知,类型Id
只是一个类型本身,即type Id[A] = A
,所以如果你有{{1}这意味着你有一些无效的输入可以提供一些输出。但是在Process[Id, O]
的情况下,根本不应该有任何输入,它应该只生成一些输出。