为什么Process0未定义为Process [Id,O]

时间:2014-09-13 07:22:02

标签: scala scalaz scalaz-stream

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]

1 个答案:

答案 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]的情况下,根本不应该有任何输入,它应该只生成一些输出。