кроме того для ньютайпов есть один важный инструмент: coerce
если два типа X и Y это просто номинально разные версии одного и того же типа (например X - ньютайп над Y, или они оба ньютайпы от другого типа Z, который тоже может быть ньютайпом), то можно, и конструкторы X и Y есть в контексте, то существует функция coercе, которая сменит номинальный тип
newtype X = X Int
a :: Int
a = 1
b :: X
b = coece a
c :: [Int]
c = [1, 2, 3]
d :: [X]
d = coerce x
plus :: Int -> Int -> Int
plus a b = a + b
plus_xxx :: X -> X -> X
plus_xxx = coerce plus
plus_xix :: X -> Int -> X
plus_xix = coerce plus_xxx -- = coerce plus
писать d = map coerce x нет смысла, так как это по сути будет map id