アプリケーションの型クラス、特に_<*>
_関数を理解しようとしています。型シグネチャがf (a -> b) -> f a -> f b
であることがわかりました。f
はファンクタであり、データをラップするある種の構造体と考えています。 出現f
はジェネリック型を処理する必要がある、つまりf
がパラメータ化された型a
、b
、そして実際には_a -> b
_もサポートする必要があります。
私の理解が正しい場合、私たちがしていることは、最初にいくつかのデータをラップすることを目的とするタイプクラスf
を操作することです。たとえば、文字列のリストやファイルバッファーを含むツリーなど、必要なランダムなもの。ただし、f
は1つの型にコミットしないでください。そのような型を処理する必要があるだけでなく、データから他のデータへの関数も処理する必要があるためです。したがって、以下を含む_<*>
_の実装例がある場合
_Just2 f <*> j = fmap f j
_
これを読む方法は、j
が_Just2
_内のある種のデータであることです。 f
は、データをデータにマップする関数です。そしてf
は_Just2
_でラップされています。
それでよろしいですか?基本的に私の質問は次のとおりです。適用可能なものは、常に任意のデータを同時に処理し、データ間で機能するように汎用的である必要がありますか?または、たとえばリストのみが許可されるようなアプリケーションを作成する方法はありますか?
あなたの質問から、多くの異なるApplicative型クラスが存在する可能性があるようです。しかし、1つしかありません。したがって、それはジェネリックでなければなりません。
The適用可能な型クラスは、その関数(<*>
およびpure
)および法律により、これらの関数は準拠する必要があります。どのHaskellコードベースでも、定義は1つだけです。しかし、the Applicative typeclassのインスタンスを持つ多くの型が存在する可能性があります。 instance
宣言を使用して、必要な関数を定義することにより、独自のインスタンスを定義できます。ただし、コンパイラーは、定義が関手の法則に従っているかどうかをチェックしません。これは、ユーザーが確認する必要があります。
Functor、Applicative、Monadのような型クラスはデータ型を指定しません。 「リストのような」タイプや「ボックスのような」タイプのイベントが必要であると彼らは言っていませんが、リストやEither
のような他のコンテナにはこれらのタイプのクラスのインスタンスがあります。適用法が適用されるような方法で必要な機能を装備できるタイプは、適用型になります。
コンテナーやボックスを考えると役立つことがよくあります。ただし、関数のような型のApplicativeインスタンスを使用したら、その直感を拡張する必要があります。例:a -> r
。
OO言語のインターフェイスと比較すると、型クラスの方が強力です。型自体のソースコードにアクセスできない場合でも、一部のデータ型を型クラスのインスタンスとして定義できるためです。