haskell-jp / questions #99 at 2021-11-03 13:51:14 +0900

あまり経験がなかったので気になったのですが、newtypeで宣言できる型をdataで宣言するユースケースって何があるでしょうか?
あとでフィールドを増やす可能性のあるデータ型など自明な場合を除くと、 lens越しに正格な更新をするための治具という使い方もあります
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)
stackoverflowのやつとはちょっと違いそう
もうちょっと考えます
正格性が異なるのでその例とは意味合いが違ってきそうです。突き詰めると「newtypeで宣言できる型をdataで宣言する」という表現自体が意味をなさなくなってしまいそうですね……