2014-09-13 42 views
1
sealed trait Process[+F[_], +O] 
/** 
* Created by pach on 11/07/14. 
*/ 
package object stream { 

    type Process0[+O] = Process[Nothing,O] 
... 
} 

這是Process0如何定義的。爲什麼Process0沒有被定義爲過程[ID,O]

其實我不明白爲什麼這個編譯,因爲Nothing概不Param類型。

要使用沒有影響

爲什麼不只是設置上下文類型˚F到值類型本身(使用身份類型構造,​​)表示的流。

type Process0[+O] = Process[Id, O] 
+0

爲什麼你不期望它編譯? 「Nothing」是編譯器知道的所有類型的子類型,即使你有一個複雜的類型,Nothing也不會是一個子類型。 – 2014-09-13 07:46:15

+0

@EndeNeu寫'過程[+ F [_] + O]',我們實際上預計'F'有一種類型的參數,但'Nothing'不帶參數,所以,這是一個令人感到有點驚訝 – jilen 2014-09-13 07:48:48

+0

我要說編譯器足夠聰明,知道無論類型是如何構造的,或者無論它需要多少類型參數,Nothing都不會是它的一個子類型,遺憾的是,這個主題沒有具體的內容。 – 2014-09-13 07:59:04

回答

1

斯卡拉編譯器將Nothing有點不同於其他類型,e.g同樣的招數不會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流,但據我所知型Id只是一個類型本身,即type Id[A] = A,所以如果你有Process[Id, O],這將意味着你有一些非effectful輸入這給一些輸出。但在Process0的情況下,根本不應該有任何輸入,它應該只產生一些輸出。