2013-12-09 18 views
8

Temelde başka bir veri türüne etiket olarak davranan bir türü var:sarılmış tipin örneğini "Miras"

import Data.Word 
data RijndaelField = RF Word8 

ben RijndaelField en basit şekilde Bits arasında Word8 örneğini "miras" istiyorum:

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 ve Word8 arasındaki ilişkiyi ifade etmek için bir kısa yol var mı?

cevap

12

Eğer soyut veri tiplerini veya kayıt türlerini gerekmiyorsa şunu kullanabilirsiniz bir newtype yerine GeneralizedNewtypeDeriving ile:

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 

import Data.Bits 
import Data.Word 

newtype RF = RF { unRF :: Word8 } deriving (Eq, Bits) 

gerçekten, diğer sınıfların

bir sürü içerebilir isteseydim
newtype RF = RF { unRF :: Word8 } 
    deriving (Eq, Bits, Num, Integral, Real, Enum, Ord, Show) 

Eğer

> 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} 
olarak kullanma izni Hangi

Oldukça kullanışlı olduğunu düşündüğüm

+0

Tam olarak aradığım şey bu, teşekkür ederim. (Her şey için bir eklenti var!) – Snowball

+0

@Snowball Just about =) Bu, özellikle bir monad transformatörü yığınını tamamlarken kullanışlıdır, derleyicinin "Monad", "Functor", "MonadTrans", MonadState MyState', 'Applicative' ve daha fazlası. Çok sayıda klişe kodu üretmek için çok kullanışlıdır. – bheklilr