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 가 없네