2017-04-12 3 views
2

오늘 모나드를 이해하려고 시도한 후 >>=으로 놀고 있었고 흥미로운 패턴을 발견했습니다. 목록 모나드로 작업 할 때 >>=은 concatMap처럼 작동하는 것으로 보입니다. 나는 유사점을 찾기 위해 주위를 둘러 보았고, 특히 해킹에 대한 정의를 살펴 보았다.>>>와 concatMap의 차이점

어떤 것들은 내가 노력 :

[1, 2, 3] >>= (iter 5 id) => [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]

concatMap (iter 5 id) [1, 2, 3]=> [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3] 

[1, 2, 3] >>= (iter 5 (+5)) => [1,6,11,16,21,2,7,12,17,22,3,8,13,18,23]

concatMap (iter 5 (+5)) [1, 2, 3] => [1,6,11,16,21,2,7,12,17,22,3,8,13,18,23]

iter 그냥 비 무한으로 반복이다,

iter i f a = toL $ Data.Sequence.iterateN i f a 
    where 
    toL = Data.Foldable.toList :: Data.Sequence.Seq a -> [a] 

(repl.it에서 작업하므로 가져 오기가 엉망입니다.)

(>>=)은 목록의 경우 concatMap과 동일합니까? concatMap의 일반화인가요?

+0

이 구현에 대한 자세한 설명은 https://en.wikibooks.org/wiki/Haskell/Understanding_monads/List를 참조하십시오 모나드 목록 유형. 또한 https://wiki.haskell.org/All_About_Monads#List_is_also_a_monad. – bheklilr

답변

5

예, 목록의 경우 은 concatMap입니다. >>=은 모든 Monad에 대해 fmapjoin (일반화 : concat)의 조합이므로 직관적으로 이해할 수 있습니다.

+0

조인에 대해 감사드립니다. 나는 결코 그것을 깨닫지 못했습니다! –

9

예, 인수를 대칭 이동합니다. 특별한리스트 구문을 방해하지만 이러한 유형의 서명을 비교하면, 유사성을 가지고해야합니다

Prelude> :t flip concatMap 
flip concatMap :: Foldable t => t a -> (a -> [b]) -> [b] 
Prelude> :t (>>=) 
(>>=)   :: Monad m => m a -> (a -> m b) -> m b 
+2

목록 형식 생성자를 접두사 형식 ('Foldable t => ta -> (a -> [b] -> [] b')에 쓰는 것은 합법적입니다. 더 많은 괄호 [] ([] a)'대'[[a]]'). –