Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell &引用;继承;包装类型的实例_Haskell_Typeclass - Fatal编程技术网

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
,等等。它对于生成大量样板代码非常方便。