はこれが何を話していることは型コンストラクタ[]
とMaybe
、fmap
のような機能のない構図のようなの組成物です。したがって、たとえば、[]
とMaybe
を構成する2つの方法があります。
newtype ListOfMabye a = ListOfMaybe [Maybe a]
newtype MaybeOfList a = MaybeOfList (Maybe [a])
は2 Functors
の組成はFunctor
であることを声明では、これらのタイプのFunctor
インスタンスを書くの定型方法があることを意味します
:実際には
instance Functor ListOfMaybe where
fmap f (ListOfMaybe x) = ListOfMaybe (fmap (fmap f) x)
instance Functor MaybeOfList where
fmap f (MaybeOfList x) = MaybeOfList (fmap (fmap f) x)
は、Haskellのプラットフォームはあなたに、この「無料で」いCompose
タイプを与えるモジュールData.Functor.Compose
が付属しています
import Data.Functor.Compose
newtype Compose f g a = Compose { getCompose :: f (g a) }
instance (Functor f, Functor g) => Functor (Compose f g) where
fmap f (Compose x) = Compose (fmap (fmap f) x)
Compose
はGeneralizedNewtypeDeriving
拡張に特に有用である2つのApplicative
Sの組成物はまたApplicative
ある
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype ListOfMaybe a = ListOfMaybe (Compose [] Maybe a)
-- Now we can derive Functor and Applicative instances based on those of Compose
deriving (Functor, Applicative)
留意されたいです。したがって、[]
とMaybe
はApplicative
であるので、Compose [] Maybe
とListOfMaybe
です。あなたがモナドの完全な力を必要としない場合のためのモナド変圧器の代替案として、最近ではますます一般的になりつつあります。
ghciで実際にfmapを作成しようとしましたか?すなわち ':t fmap。 fmap' – Squidly
@MrBonesチップをありがとう! ghciアクセス権を持たない人のために、出力は '::(Functor f1、Functor f)=>(a - > b) - > f(f1 a) - > f(f1 b)' – akbiggs