Haskell 학습 - functor
Functor
functor는 맵 조작을 실행할 수 있는 대상입니다. functor는 의미를 부가한 표현식처럼 상자로 비유할 수 있습니다.functor의 정의는 다음과 같이 이해할 수 있다. a가 b에 비치는 함수와 a가 담긴 상자를 제시하면 b가 담긴 상자를 되돌려준다.fmap은 function과 functor를 받아들이는 함수로 볼 수 있으며, function을 functor의 모든 요소에 적용합니다.
-- Functor
class Functor f where
fmap :: (a -> b) -> f a -> f b
맵 오버(map over)를 수행할 수 있는 유형은 Functor 기본 클래스를 계승하고 fmap 함수를 실현해야 합니다.몇 가지 기본 Functor 형태를 살펴보겠습니다.
-- functor :
instance Functor [] where
fmap = map
--
fmap (*2) [1,2,3]
> [2,4,6]
-- Maybe functor :
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap f Nothing = Nothing
--
fmap (*2) (Just 1)
> Just 2
fmap (*2) (Nothing)
> Nothing
-- IO Functor
instance Functor IO where
fmap f action = do
result "hello! jeff"
Functor의 (->) r 형태
(->)r는 함수 결합, 즉 (.)
-- , (->) r Functor
instance Functor ((->) r) where
fmap f g = (\x -> f (g x))
instance Functor ((->) r) where
fmap = (.)
--
fmap (*3) (+100) 1
> 303
(*3) . (+100) $ 1
> 303
functor law
만약 어떤 유형이 이 두 법칙을 준수한다면, 그것은 다른 Functor와 매핑에 있어서 같은 성질을 가진다.
fmap id (Just 3)
> Just 3
id (Just 3)
> Just 3
Applicative Functor
Applicative Functor가 필요한 이유, 어떤 상황에서 사용해야 하는지.Functor 정의에서 알 수 있듯이 fmap 함수는 한 개의 상자만 비추지만, 두 개의 세 개, 심지어 더 많은 상자를 비추어야 한다면?아니면 반환값이 함수인 상자를 처리해야 하나요?이것이 바로 Applicative Functor가 처리해야 할 상황이다. Applicative Functor는 Functor의 증가판으로 볼 수 있으며, 정의에서 알 수 있듯이 주로pure와 두 함수를 포함한다.
-- Applicative Functor
class (Functor f) => Applicative f where
pure :: a -> f a
() :: f (a -> b) -> f a -> f b
-- fmap , a -> b f
() :: f (a -> b) -> f a -> f b
fmap :: (a -> b) -> f a -> f b
-- ,
pure (+) Just 3 Just 5
(pure (+) Just 3) Just 5。
() :: (Functor f) => (a -> b) -> f a -> f b
f x = fmap f x
--
pure f x = fmap f x
이어서 기본 applicative functor 몇 개를 보십시오. 응용 프로그램을 계승하려면 pure와 () 함수를 실현해야 합니다.
-- Maybe Applicative :
instance Applicative Maybe where
pure = Just
Nothing _ = Nothing
(Just f) something = fmap f something
--
pure (+3) Just 9
> Just 12
pure (+) Just 3 Just 5
> Just 8
-- list
instance Applicative [] where
pure x = [x]
fs xs = [f x | f [1,2]
> [4,5,2,4]
--
(*) [2,5,10] [8,10,11] -- Applicative style
[ x * y | x [16,20,22,40,50,55,80,100,110]
--IO Applicative instance
instance Applicative IO where
pure = return
a b = do
f getLine getLine
aa
bb
> "aabb"
Applicative Functor의 (->) r 형태
(->)r 형태 정의
instance Applicative ((->) r) where
pure x = (\_ -> x)
f g = \x -> f x (g x)
이어서 위의 지식을 종합하여 실제 응용 응용 응용 응용 응용 프로그램의 몇 가지 방식을 살펴보자.functor보다 applicative functor가 더 강하고 유연합니다.
-- , functor, functor
pure (\x y z -> x+ y +z) Just 3 Just 4 Just 5
> Just 12
[(+3),(*2)] [1,2]
> [4,5,2,4]
-- fmap() , , functor
(+) Just 1 Just 2
> Just 3
(\x y z -> x + y +z) [1,2] [2,3] [4,5]
> [7,8,8,9,8,9,9,10]
-- () (->) r , ,
(\x y z -> [x,y,z]) (3+) (*100) (`div`2) $ 2
> [5,200,1]
Applicative Functor 보조 함수
-- applicative
liftA2 f a b = f a b
--
liftA2 (:) (Just 3) (Just [4])
(:) Just 3 Just [4]
pure (:) Just 3 Just [4]
> Just [3,4]
-- sequenceA
sequenceA (x:xs) = (:) x sequenceA xs
sequenceA = foldr (liftA2 (:)) (pure [])
sequenceA [Just 3, Just 2, Just 1]
> Just [3,2,1]
-- list
sequenceA [[1,2,3],[4,5,6]]
> [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
sequenceA [(>4),(<10),odd] 7
map (\f -> f 7) [(>4),(<10),odd]
> [True,True,True]
-- and Bool, True True
and $ sequenceA [(>4),(<10),odd] 7
and $ map (\f -> f 7) [(>4),(<10),odd]
> True
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.