2017-08-27 25 views
2

Scalaではなぜファンクタ高い-Kinded私はファンクタの定義以下のいるタイプ

trait Functor[F[_]] { 
    def map[A, B](fa: F[A])(f: A => B): F[B] 
} 
object ListFunctor extends Functor[List] { // 
    def map[A, B](f: A => B)(data: List[A]): List[B] = data map f 
} 

が、Fは、コレクション型は、リストとして、であることは非常に一般的です

、配列は、オプション、私は理由を尋ねるファンクタですタイプのパラメータ Fは本当に何を意味するのですか?

+0

Functorは、ListやOptionのような多くの(上位の種類の)共通のインターフェイスです。型パラメータFは、 "これは私たちがインタフェースを定義する型です"と言っています。 –

+0

ありがとう@n.m。あなたの説明はコードの観点から意味があります。私はFunctor [F [_]]のような形式を取る理由を聞きたい。ファンクタは、A => Bで与えられたF [A]をF [B]に変換することを目指していると私は思っています。 F [A]とF [B]が意味を持つのであれば、コンテナやコンテクスト、または他のものにすることができます。 – Tom

+0

もし 'map'の署名がどうなっているのでしょうか? – sepp2k

答えて

2

ファンクタは高いkindedタイプ

Functorなければならない理由は、我々は、それ自体が型パラメータを取るタイプパラメータオーバー抽象にしたいので、高いkindedなければなりません。

Functorが扱うタイプを「1次型」といい、その種類は* -> *です。 Functorの実装を見ると、インナー型のパラメータを抽象化しています。たとえば、ファンクタをListに定義すると、例のようにファンクタをFunctor[List]と定義します。ご覧のように、具体的なのファンクタを作成するのではなく、Listの中に含まれる型パラメータを作成しています。このような抽象クラスは、一度このような型クラスを定義すると、List型(List[String]またはList[Int])に使用できるため、大きな力を発揮します。

私はいつも彼の論文「Aより高いの種類のGenrics」にアドリアン・ムーアによって描かれた画像を参照したい:

Higher Kinds

型パラメータFは本当に

をどういう意味

F唯一の目的は、Functorの実装者との契約を定義することです。 Fの署名によって、我々はどのような種類の種類が推測できるかFunctorが期待している。それが1つの「プレースホルダー」([_])を持っていることがわかると、慣習上、これはFが単一の型パラメータを取るべきであることを意味することがわかります。我々は、単一の型パラメータを取るすべてのタイプを考えるならば、我々は、より高いkindedタイプに関するより広範な説明については例などListOptionTryFutureTask

のために、多くがあることがわかります、 What is a higher kinded type in Scala?

+0

tl; dr:定義による。 :)もちろん、Higher-Kinded Typeが既に定義されている場合。 – pedrofurla

0

これはちょっと違う答えです。 Functorの署名の意味F[_]の存在(高級型)は、Functorがtypeclassであることを意味します。 TypeclassesはScalaの機能で、既存の型に変更を加えずに機能を追加することができます。従ってはここでは単一のタイプではなく、他の多くのタイプの青写真です。言い換えれば、それは単一の型ではなく、型のクラスなので、 "型クラス"という言葉です。

今、具体的なファンクタを作成します。その具体的な型をその青写真の型パラメータとして渡す必要があります。具体的な型自体には、必要ならfunctorの数学的定義によって1つの型パラメータがなければなりません。これは、より高級なタイプF[_]Functorの意味であることを意味します。

関連する問題