Haskell &引用;继承;包装类型的实例
我有一个类型基本上充当另一个数据类型的标记:Haskell &引用;继承;包装类型的实例,haskell,typeclass,Haskell,Typeclass,我有一个类型基本上充当另一个数据类型的标记: 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 R
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
之间的关系?如果您不需要ADT或记录类型,您可以使用newtype
代替generalizednewtypedering
:
{-# 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}
我觉得它很方便这正是我想要的,谢谢。(所有东西都有一个扩展!)@Snowball大约=)这一个在包装一堆monad Transformer时特别有用,你可以让编译器派生一些东西,比如
monad
,Functor
,MonadTrans
,MonadState MyState
,Applicative
,等等。它对于生成大量样板代码非常方便。