Show для Set выглядел бы ужасно
ну, это правда. Это можно было бы решить иначе, сделав вместо строк какое-то аст
show s = record "Set" [("fromList", show (toList s))]
и в принципе тут мб можно даже придумать, как сразу задавать парсер и притипринтер одной функцией