살펴보는게 너무 고통스럽습니다.
아니 솔직히 말할게요
IdentityT 빼고는 하나도 성공하지 못했습니다.
이제까지 모나드 공부할때마다
1. 모나드를 통한 자연스러운 어플리카티브 도출과 실제 어플리카티브의 구현이 일치하는가
2. 어플리카티브를 통한 자연스러운 펑터 도출과 실제 펑터의 구현이 일치하는가
3. 모노이드 제약조건 하에서, 어플리카티브를 통해 도출한 자연스러운 모노이드는 어떤 형태를 가지는가
4. Foldable의 foldr 과 foldM은 서로가 서로를 자연스럽게 도출하는가 (자연스러운 도출과 실제 구현이 일치하는가)
5. Traversable 에서 Identity 어플리카티브를 주면 functor가 되는가, Constant 어플리카티브를 주면 foldMap이 되는가
를 전부 체크해서
"모나드" 라는 하나의 개념을
펑터 어플리카티브 폴더블 트래버서블 로 전부다 연결시켜서 확장시켰는데요,
심지어
이런것도 했습니다.
(f <$> m) >>= g
는
(m >>= g . f) 와 같다. (실제로 풀어서 써보면, m >>= return . f >>= g가 되고, 여기에 모나드 결합법칙을 적용해서 (\x -> (return . f) x >>= g) 를 만들면,
(\x -> return (f x) >>= g) 가 되고, 이는 모나드 레프트 아이덴티티에 의해 (\x -> g (f x)) 가 됩니다.
m >>= \x -> g ( f x) 가 m >>= g . f 가 되는것을 알 수 있죠.
라던가
이런걸 응용해서
"이렇게 도출한 타입매칭과 저렇게 도출한 타입 매칭이 모두 같은 결과물인가?"
를 많이 생각해봤었습니다.
특히, (f <$> m) >>= g 같은 경우는 IO 라던지 복잡한 모나드트랜스포머에 대해서도 적용 가능한 항등식이라서 쏠쏠하게 재미를 봤죠.
어, 이것도 자연스럽고 저것도 자연스러운데.... 어떤게 맞을까???? 하는 그 물음...
이건 자연스러운데 그냥 자연스럽게 직관화 시켜버리고 싶은데, 그 자연스러움 뒷부분에 수학적 기틀을 마련하고 싶다.
문장처럼 자연스럽게 읽히는 이 구문은 읽히기만 자연스러운게 아니라 실제로 정확한 것이다!!!!
예
서론이 너무 길어졌네요.
MaybeT 의 모나드가, Composition 에 대한 어플리카티브와 호환이 가능한지 증명에 실패했습니다.
더 풀어서 쓰자면,
Monad m => Monad (MaybeT m) 의 인스턴스를 통해서
do
x <- (MaybeT m (a -> b))
y <- (MaybeT m a)
return x y
한 대상이, (용어가 난잡한건 죄송합니다. 근데 아마 뭘 얘기중인지 아실거라 믿습니다.)
Compose 의 어플리카티브인
(<*>) <$> (MaybeT m (a -> b)) <*> (MaybeT m a)
와 일치하는지가 궁금합니다.
하......
앞으로 배우게 될 모든 모나드 트랜스포머에 대해서 이 항등식을 체크할 생각을 하니까 갈길이 굉장히 멀게만 느껴집니다
스택좆버플로우에 물어보까... 하스켈하는사람들은 보통 착하더라. 우후훗
뭐라고 하는거임?
모나드, 펑터, 어플리카티브, 모노이드, 폴더블, 트래버서블 모두 하나의 공통된 문맥으로 이어져있어야 하는데, 모나드 트랜스포머들에 대해서는 모나드가 어플리카티브와 똑같은 맥락인지 파악하기가 힘듦. 그래서 답지를 요청함. 어째서 MaybeT m 의 모나드와 MaybeT m의 어플리카티브는 일치하는가 (일치한다의 의미는 do x <- mf ; y <- ma; return x y 가 mf <*> ma 라는 뜻) 의 증명을 요청하는중. MaybeT까진 사실 스스로 어찌어찌 해볼만한데, StateT 가면 난장판될거같음
해결 됨. MaybeT는 애초에 Compose의 어플리카티브와 호환이 안됨. 틀린 명제를 증명하고있던것