2014-02-08 61 views
6

在下面的代碼(從Functional Programming in Scala):「更高Kinded類型應啓用」 警告

trait Functor[F[_]] { 
    def map[A,B](fa: F[A])(f: A => B): F[B] 
} 

trait Monad[F[_]] { 
    def unit[A](a: => A): F[A] 
    def flatMap[A,B](ma: F[A])(f: A => F[B]): F[B] 
    def apply[A](a: => A): F[A] 
} 

我看到下面的警告:

[warn] C:\...\Monad.scala:3: higher-kinded type should be enabled 
[warn] by making the implicit value scala.language.higherKinds visible. 
[warn] This can be achieved by adding the import clause 'import scala.language.higherKinds' 
[warn] or by setting the compiler option -language:higherKinds. 
[warn] See the Scala docs for value scala.language.higherKinds for a discussion 
[warn] why the feature should be explicitly enabled. 
[warn] trait Functor[F[_]] { 
[warn]    ^
[warn] C:\...\Monad.scala:7: higher-kinded type should be enabled 
[warn] by making the implicit value scala.language.higherKinds visible. 
[warn] trait Monad[F[_]] { 

這是怎麼回事?請注意,我讀了這個post,但並不理解它。

+0

參見[SIP-18 - 模塊化中語言功能(http://docs.scala-lang.org/sips/完成/模塊化-語言的features.html)。 – senia

回答

9

請參閱文檔以瞭解higherKinds

只有在啓用此標誌的情況下,纔可以寫入更高版本的類型。

這些設計模式暗含的抽象級別往往是理解Scala代碼庫新手的障礙。

出於某種原因,沒有人開玩笑說:

更高kinded類型斯卡拉導致圖靈完備型系統, 其中編譯終止不再保證。

...雖然通常它只會在碰撞早期終止。

這只是一個笑話。

+0

謝謝,@ som-snytt。 「編譯器終止不再有保證」是一個笑話嗎? –

+0

有趣的是:[Qi](https://en.wikipedia.org/wiki/Qi_(programming_language))語言(及其部分[spinoffs](https://en.wikipedia.org/wiki/Shen_(programming_language) )))已知有一個完整的圖靈(因此可能是最有可能的定義)類型系統 - 斯卡拉然後提供了一個等效強大(但可能不是表達式)類型系統? –

+0

doc導致無效鏈接。 – javadba

2

如果要禁止這種警告,只需添加到您的導入部分:

import scala.language.higherKinds