Ho un tipo che agisce in sostanza come un tag su un altro tipo di dati:"Ereditare" istanza di tipo avvolto
import Data.Word
data RijndaelField = RF Word8
voglio RijndaelField
a "ereditare" l'istanza Word8
del Bits
nel modo più semplice possibile:
import Data.Bits
instance Bits RijndaelField where
RF a .&. RF b = RF $ a .&. b
RF a .|. RF b = RF $ a .|. b
RF a `xor` RF b = RF $ a `xor` b
complement (RF a) = RF $ complement a
shift (RF a) n = RF $ shift a n
rotate (RF a) n = RF $ rotate a n
bitSize (RF a) = bitSize a
isSigned (RF a) = isSigned a
testBit (RF a) n = testBit a n
bit n = RF $ bit n
popCount (RF a) = popCount a
esiste un modo più breve per esprimere che relazione tra RijndaelField
e Word8
?
Questo è esattamente quello che stavo cercando, grazie. (C'è un'estensione per ogni cosa!) – Snowball
@Snowball Quasi =) Questo è particolarmente utile quando si avvolge una pila di trasformatori monad, si può avere il compilatore derivando cose come 'Monad',' Functor', 'MonadTrans',' MonadState MyState', 'Applicative', e altro ancora. È molto utile per generare un sacco di codice boilerplate. – bheklilr