2017-07-25 15 views
6

typescalaという意味で分かりにくいと思います。型とは何ですか?スカラーの型コンストラクタは何ですか?

ドキュメントでは、List[Int]は型であり、Listは型のコンストラクタです。

typeとは、次のように書くときの意味ですか?

val ls: _root_.scala.collection.immutable.List.type = scala.collection.immutable.List 

そして、どのようにこのtypeは、例えば特性にフィールドとして定義することができtypeに関連します。上記のようなスカラval割り当てにおいて

+1

'val x:Int = 1'、' Int'は 'x'の型です。 リテラル( 'Int'や' 'James" 'の' String'には '1'や' 2')を使って特定の型( 'Int'や' String'など)を使うことができます。 型コンストラクタは、他の型を構築する必要がある型です。 'List'または' Option'は、別の型を渡さない限り、完全修飾型ではありません(List [Int]またはOption [String] ' – mfirry

答えて

3

何キーワードタイプとは、次のように書くときのことです。

typeは、Scalaのobjectで定義されているメンバです。

は、クラスとそのコンパニオンオブジェクトがあるとします。

class Foo(a: String) 

object Foo { 
    def apply(a: String) = new Foo 
} 

は今、あなたが入力としてオブジェクトFooを受け入れる方法を書きたいとしよう。そのタイプは何ですか?

あなたはこれが書く場合:

def someMethod(fooObj: Foo) = fooObj.apply("x") // doesn't compile 

コンパイルするつもりはありません。 Fooは、クラスのインスタンスのタイプ(すなわち、new Foo("x")またはFoo("x")によって返されるタイプ)を参照します。あなたの具体的な例List.type

def someMethod(fooObj: Foo.type) = fooObj.apply("x") // compiles! 

Listのコンパニオンオブジェクトのタイプです:オブジェクトは、自分のタイプを参照することができtypeメンバーが持っている理由です。

val listObj: List.type = List 
val anEmptyList: List[Int] = listObj.empty[Int] // List() 
val aListOfIntegers: List[Int] = listObj.range(1, 4) // List[(1, 2, 3) 

そして、どのようにそれを入力するために関連したこのタイプは、例えば特性にフィールドとして定義することができます:ここで私はそれが何を意味するのか明確に願っています例のカップルです。

typeキーワードはタイプメンバーを定義します。 .typeタイプメンバです。概念的には、Scalaですべてのオブジェクトのようなものです。このようなタイプのメンバーの名前のタイプ、があります。

object Foo { 
    type type = Foo 
} 

を明らかにこれはコンパイルされませんが、それはあなたにそれがどのように見えるかもしれないもののアイデアを提供します。

2

val name: Tpe = expression 

Tpe識別子nameのタイプです。したがって:

val x: List.type = List 

Listオブジェクトのタイプ(別名リストモジュール又はリストコンパニオン)がList.typeあります。これはシングルトンであることを示します。このすべては、タイプ理論のタイプコンストラクタコンセプトと完全に直交しています。

タイプコンストラクタ

型理論で

は、List(注:いないコンパニオン)ので、あなたは(Listに型引数を指定するとき例えばint型(*を示す)と、型コンストラクタ(* -> *を示す)の両方であります)あなたはタイプ(すなわちList[Int])を持っています。 Scalaはこの構造の構文を提供します。たとえば:あなたはFについての詳細を知っている限り

def foo[F[_]]: F[Int] 
     ^^^^  ^^^ 
     |  + supply a type argument to F[_] 
     | 
     + the type constructor F[_] 

しかし、あなたは本当にこのような方法を実装することはできません。 Scalaので

def foo[F[_]: Monad]: F[Int] = Monad[F].pure(1) 

スカラ座あなたの周りListタイプとして型コンストラクタなどを通過させない:暗黙のscalaz.Monad[F]がある場合はそうは次のようにたとえば、あなたがあなたのF[Int]を構築するためにMonad.pure値を使用する場合がありますこのような方法のパラメータ。例:あなたはfoo[List]に供給しているListないコンパニオンfooの宣言は次の警告になります

注意ですが

scala> def foo[F[_]]: F[Int] = ??? 
foo: [F[_]]=> F[Int] 

scala> lazy val x = foo[List] 
x: List[Int] = <lazy> 

<console>:11: warning: higher-kinded type should be enabled 
by making the implicit value scala.language.higherKinds visible. 
This can be achieved by adding the import clause 'import 
scala.language.higherKinds' 
or by setting the compiler option -language:higherKinds. 
See the Scaladoc for value scala.language.higherKinds for a discussion 
why the feature should be explicitly enabled. 
     def foo[F[_]]: F[Int] = ??? 
      ^

関連する問題