2013-12-09 136 views
8

我有型,基本上充當另一個數據類型標籤:「繼承」實例包裹型

import Data.Word 
data RijndaelField = RF Word8 

我想RijndaelField以「繼承」的Bits以儘可能簡單的方式Word8實例:

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 

是否有表達RijndaelFieldWord8之間的關係更短的方法是什麼?

回答

12

如果您不需要抽象數據類型或記錄類型,你可以使用一個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} 

我認爲這非常方便

+0

這正是我所期待的,謝謝。 (有一個擴展的一切!) – Snowball

+0

@Snowball只是約=)這一個是特別有用的時候包裝了一堆monad變換器,你可以讓編譯器派生'Monad','Functor','MonadTrans','' MonadState MyState','Applicative'等等。生成大量樣板代碼非常方便。 – bheklilr