instance Applicative [] where
pure = repeat
[] <*> _ = []
_ <*> [] = []
(f:ff) <*> (x:fx) = f x : (ff <*> fx)
instance Monad [] where
return = pure
m >>= k = traceWith (:) (k <$> m)
traceWith f [] = []
traceWith f (xs:xss) = case xs of ->
[] -> []
x:_ -> x `f` traceWith f (tail' <$> xss)
tail' [] = []
tail' (_:xs) = xs
traceWith (:) 가 join임
이거 모나드 되지 않냐
Control.Applicative 에는 Monad ZipList 가 없네
https://mail.haskell.org/pipermail/haskell-cafe/2009-April/059088.html
아 미친 이런 좋같은 반례는 어디서 가져오는거냐 ㅋㅋㅋㅋㅋㅋㅋㅋ
http://m.dcinside.com/board/github/2361
- dc App
아 반례가 있구나 ㅠ - dc App
근데 bottom을 피하지 않으면 어떻게 됨? tail'를 tail로 바꾸면? - dc App
bottom을 넣으면 monad law 를 만족하게 할 수는 있나봄. 근데 그렇게 하면 좀 못생겨서 안껴주나봐 ㅋㅋ
근데 tail 넣으면 [1,2,undef] 가 아니라 1:2:undef 라서 이렇게 해도 만족하는지는 모르겠다. 위 링크에서는 전자를 예로 들더라고
map tail ([] : []) = undefined : [] 아님? 똑같이 [1, 2, undefined]가 될 것 같은데요. - dc App
제가 이해를 잘못한 건가요? 가르침을 주세요. ㅇㅅㅇ - dc App
(x:xs):xss = [[1,2], []]; xss' = map tail xss = [undef]; result = x : traceWith (:) xss' = x : undef 잖아. map 한결과를 traceWith 에서 다시 패턴 매칭 하니까 (_ : undef) 가 맞을껄
제가 틀렸네요 ㅈㅅ 오늘도 한 수 배웠습니다 - dc App
그나저나 모나드인 거 어떻게 아심? 역시 고수 ㄷㄷ - dc App
traceWith 보고 모나드인걸 안게 아니라 ZipList 에 대응되는 모나드를 찾은거임
저는 대응되는 모나드가 있는 걸 논문 보고 알았는데 님은 혼자서 아신 게 머단함 - dc App