sarashino
            
          あまり経験がなかったので気になったのですが、newtypeで宣言できる型をdataで宣言するユースケースって何があるでしょうか?
        data Box a = Box { unBox :: a } deriving (Functor)
instance Applicative Box where
    pure = Box
    Box f <*> Box a = Box (f a)
-- (t %~! const undefined) x === undefined
(%~!) :: ((a -> Box b) -> s -> Box t) -> (a -> b) -> s -> t
t %~! f = unBox . t ((Box $!) . f)