以下のようなXに対して f を介して引数を与える場面で
同じ記述を繰り返し記述することになって格好悪いのですが
なんとかならないものでしょうかという相談です。

import Data.Char (chr)
data X = X A B C D deriving Show
newtype A = A Int deriving Show
newtype B = B String deriving Show
newtype C = C Char deriving Show
newtype D = D Double deriving Show
class F a where f :: Int -> a
instance F A where f = A
instance F B where f = B . show
instance F C where f = C . chr
instance F D where f = D . fromIntegral

> X (f 43) (f 43) (f 43) (f 43)
X (A 43) (B "43") (C '+') (D 43.0)