Haskell では、インスタンスの型シグネチャで ((->) t) はどういう意味ですか? たとえば、Functor、Applicative、および Monad はすべて、次のようなインスタンスを持ちます。
Functor ((->) r)
この型シグネチャが何を意味するのかについての説明は見つかりません。また、検索エンジンに対する耐性が非常に高いです。
Haskell では、インスタンスの型シグネチャで ((->) t) はどういう意味ですか? たとえば、Functor、Applicative、および Monad はすべて、次のようなインスタンスを持ちます。
Functor ((->) r)
この型シグネチャが何を意味するのかについての説明は見つかりません。また、検索エンジンに対する耐性が非常に高いです。
->
中置型コンストラクタです。:
リスト型の中置値コンストラクターと比較できます。単独で使用する:
には、括弧で囲み、接頭辞関数のアプリケーションになります。
(:) a b
と同じですa : b
同様に、は からまでの関数の型(->) a b
と同じです。a -> b
a
b
(->) a
型コンストラクターの部分適用であり、それ自体が kind の型コンストラクターです* -> *
。
「a からの関数の型のコンストラクター」と考えることができます。たとえば(->) Int
、 からの関数の型のコンストラクタですInt
。別の型を渡すことで完全な関数型を構築できます:は からまで(->) Int String
の関数の型です。Int
String
instance Functor (->) a
関数を関数にfmap
変換する操作を持つファンクターです。引数を値に適用することで、これを類似のwhich にマップするものと比較できます。a -> b
a -> c
instance Functor (Either a)
Either a b
Either a c
fmap
Right
ラムダ関数と中置関数を使用できます。
(->) a = \b -> (->) a b --pseudo-Haskell
(->) a = \b -> a -> b --pseudo-Haskell
したがって、インスタンスを次のように読み取ります。
class Functor f where
fmap :: (a->b) -> f a -> f b
instance Functor ((->)r) where
fmap :: (a->b) -> f a -> f b
= (a->b) -> (->)r a -> (->)r b --pseudo-Haskell
= (a->b) -> (r -> a) -> (r -> b) --pseudo-Haskell
r -> a
がr
固定されているタイプのセットとして見ることができます。
ファンクターは型関数ですm
。これは、どの型に対しても型があることを意味しa
ますm a
。例はMaybe
、[]
および(->) r
です。後者は と書いたほうがいいかもしれ(r ->)
ませんが、それが許されるかどうかはわかりません。