があり、をファンクターとして使用して変換をInt
適用すると、ラップされた型、つまり. では、これをリフティングと見なすことができますか? もしそうなら、ファンクターは常に持ち上げられた型を返しますか?fmap
Maybe
Maybe Int
2 に答える
fmap
は常に type の関数を取り、type コンストラクターa -> b
の type の関数を提供します。したがって、型コンストラクターのアプリケーションを型「リフティング」に呼び出すと、はい、常に「リフティング型」で機能する関数が提供されます。1f a -> f b
f
f
a
fmap
組み込みの Haskell 型クラスFunctor
には、メンバーとして種類の型コンストラクターがあり* -> *
ます。これは、好きな型に適用して新しい型を生成できるものです (Maybe
例のように)。圏論の用語では、型構築子自体 (例: Maybe
) はソース圏のオブジェクトからターゲット圏への写像を表し、fmap
射の写像を提供します ( Hask圏はオブジェクトとして Haskell 型を持ち、射として Haskell 関数を持っていることを思い出してください)。
したがって、Haskellは、Haskell の型と関数を Haskell の型と関数にマップするためFunctor
、Hask カテゴリのエンドファンクタのみを表すことができます。しかし、それを使用してオブジェクト (型) を任意にマップすることはできないため、考えられる endofunctor を表すことさえできません。私の Haskell ファンクターは と にマップできません。型コンストラクターの下で各型を「同じ型」にマップする必要がありInt
ます ( to 、to 、toなどにマップします)。各 Haskell ファンクターの宛先カテゴリは、ファンクターの型コンストラクターの下にネストされたHaskの完全なミラー イメージです。Maybe String
Char
Bool
Maybe
Int
Maybe Int
Char
Maybe Char
Maybe (Maybe (Maybe Bool))
Maybe (Maybe (Maybe (Maybe Bool)))
したがって、Haskell のFunctor
クラスは、圏論ファンクターの一般的な概念のかなり制限されたバージョンであり、「Hask のエンドファンクター」の概念と比較してかなり制限されています。しかし、Haskell Functor について具体的に話しているのであれば、はい、結果である関数fmap
は常に「持ち上げられた」型の値を返します (そして受け取ります)。
1 Haskell の物事に適用される "lifting" と "lifted" には、さまざまな文脈で確立された多くの意味があることに注意してください。討論。