我有一个类型,基本上作为另一种数据类型的标记:
import Data.Word
data RijndaelField = RF Word8
我想RijndaelField以最简单的方式"继承" Word8实例Bits:
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
是否有更短的方式来表达RijndaelField和之间的关系Word8?
bhe*_*ilr 12
如果你不需要的ADT或记录类型,你可以使用newtype,而不是用GeneralizedNewtypeDeriving:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Bits
import Data.Word
newtype RF = RF { unRF :: Word8 } deriving (Eq, Bits)
如果你真的想,你可以包括很多其他课程
newtype RF = RF { unRF :: Word8 }
    deriving (Eq, Bits, Num, Integral, Real, Enum, Ord, Show)
哪个会让你用它
> 1 :: RF
RF {unRF = 1}
> [1..5] :: [RF]
[RF {unRF = 1},RF {unRF = 2},RF {unRF = 3},RF {unRF = 4},RF {unRF = 5}]
> let x = RF 1
> x + 2
RF {unRF = 3}
我觉得它很方便