는 이것이 대해 얘기하는 것은 타입 생성자 []
및 Maybe
, fmap
같은 기능을하지 구성 등의 구성이다.
newtype ListOfMabye a = ListOfMaybe [Maybe a]
newtype MaybeOfList a = MaybeOfList (Maybe [a])
문이 Functors
의 구성이 Functor
이 이러한 유형에 대한 Functor
인스턴스를 작성하는 공식화 된 방법이 있다는 것을 의미입니다 : 그래서 예를 들어, []
및 Maybe
를 구성하는 두 가지 방법이 있습니다
: 사실
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)
는 하스켈 플랫폼은 당신이 "무료"수행하는 Compose
유형을 제공하는 모듈 Data.Functor.Compose
와 함께 제공 15,
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
확장자 특히 유용한 두 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
s이므로 Compose [] Maybe
및 ListOfMaybe
입니다. 작문 Applicative
은 모나드의 모든 힘을 필요로하지 않는 경우 모나드 변압기의 대안으로 서서히 점점 더 보편화되고있는 정말로 청초한 기술입니다.
실제로 ghci에서 자체적으로 fmap을 구성 해 보았습니까? 즉': t fmap. fmap' – Squidly
@MrBones 팁 주셔서 감사! ghci 액세스 권한이없는 사용자의 경우 출력은':: (Functor f1, Functor f) => (a -> b) -> f (f1 a) -> f (f1 b)' – akbiggs