<$>
의 서명은 fmap
의 중위 버전이기 때문에 이해하지만 >>=
의 서명과 비교하면 내게는별로 의미가 없습니다.
먼저 내가 의미하는 바를 설정해 보겠습니다.
(>>=) :: Monad m => m a -> (a -> m b) -> m b
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
(<$>) :: Functor f => (a -> b) -> f a -> f b
우리가 >>=
왼쪽에 값을가집니다, 당신은 체인 특성을 고려하면 많은 이해하게 오른쪽에 기능을 볼 수있는 유형의 서명을 보면 : foo >>= bar >>= baz
을 어느 궁금해하게 나를 유도, 왜 <*>
및 <$>
그렇게하지? foo <*> bar
의 출력이 값이 아닌 함수가되어야하므로 foo <*> bar <*> baz
을 쓸 수 없습니다.
Just 4 <$$> (+3) <$$> (*2) >>= (\x -> Just (x-3))
경우 : 아름답게로 감소 될 수 있었다
Just 4 <**> pure (+3) <**> pure (*2) >>= (\x -> Just (x-3))
:
나는 <**>
과 =<<
모두 나에게 그런 짓을 할 수 있도록 매개 변수의 순서를 뒤집어 것이 존재한다는 것을 알고 <$$>
이 존재하거나 매개 변수 순서가 <$>
및 <*>
인 경우
차이점이 왜 존재하는지 궁금하게 만드는 또 다른 이유는 신입 사원이 기능을 찾지 않거나 그 기능을 찾지 않고 첫 번째로 오는 가치인지를 기억하는 것이 어렵게 만드는 것입니다.
그래서 왜 <*>
및 <$>
의 경우는 fn op val
있다고하지만 >>=
으로는 val op fn
있어?
을하지만 당신은 종종 Applicatives''와 정확히이 원하는 – Carsten
'(>> =)'은 체인 "명령형"을 구성한다 (그렇지 않으면 왜 우리는 왜 궁금해하게 될까?) (예 :'(+) <$> 그냥 5 <*> 그냥 5 ' 그것은 '$'와 같은 순서). '(<= <)'은 또한 chaining을 허용한다 -''(.)'style ". '(<*>)'는 다중 인수 함수를 "적용"하는데 유용합니다 - 선언 순서로 인수를 제공하십시오. –
진짜 질문은'(>> =)'이 하스켈에서 거의 모든 것과 반대의 순서를 사용하는 이유입니다. '(= =) :: Monad m => (a -> mb) -> (ma -> mb)'는 하스켈의 모든 것들이'(>> =) = flip = <<)'. –