Haskell有限字节

Haskell有限字节,haskell,instance,Haskell,Instance,我正在使用haskell编写字节定义,并结合有限字节的定义来创建有限字节的出现 这就是我到目前为止所做的: module Foldables where import Prelude hiding (Applicative(..), any, concat) import Data.Foldable import Data.Semigroup import qualified Data.Map as Map import Data.Map (Map) import Data.Map.Appe

我正在使用haskell编写字节定义,并结合有限字节的定义来创建有限字节的出现

这就是我到目前为止所做的:

module Foldables where

import Prelude hiding (Applicative(..), any, concat)
import Data.Foldable
import Data.Semigroup

import qualified Data.Map as Map
import Data.Map (Map)
import Data.Map.Append (AppendMap(..))
import Data.List (intersperse)
import Data.Maybe (maybe)
import Data.Monoid (Any(..), Sum(..))
import GHC.Generics (Generic)

class Finite (a :: *) where
   -- exists n. length elements == n
   -- forall x. elem x elements == True
   elements :: [a]

 instance Finite Bool where
   elements = [True, False]

-- The type "Either a b" is finite when both "a" and "b" are finite.


 instance (Finite a, Finite b) => Finite (Either a b) where
   elements = fmap Left elements ++ fmap Right elements

-- Similarly, the type "(a,b)" is finite when both "a" and "b" are finite.

 instance (Finite a, Finite b) => Finite (a, b) where
   elements = allPairs elements elements


 data Byte = Bits Bool Bool Bool Bool Bool Bool Bool Bool
   deriving (Generic, Eq, Show)
我只是停留在最后一行:

instance Finite Byte where
   elements = undefined
指令要求给出字节类型的有限实例。 不要在定义中显式使用True和False构造函数

(提示:使用列表单子或列表理解。)

除了未定义的内容外,请不要更改任何内容

更新

这起到了作用:

instance Finite Byte where
   elements = Bits <$> elements <*> elements <*> elements <*> elements <*> elements <*> elements <*> elements <*> elements
实例有限字节,其中
元素=位元素
您可以使用和。要构造
字节的所有值的列表

例如,如果您创建一个数据类型
Nibble

data Nibble = Nibble Bool Bool Bool Bool
您可以使用
Nibble[False,True][False,True][False,True][False,True][False,True][False,True]
获取所有可能的
Nibble
列表。因此,这将是
[Nibble-False-False,Nibble-False-False-True,…,Nibble-True-True]

如果因此使
Bool
成为
Finite
的实例,例如,则可以使用
元素
获取
Bool
的值列表,然后定义
字节
的实例:

instance Finite Bool where
    elements = [False, True]

instance Finite Byte where
    elements = …  -- with Byte, <$>, <*> and elements
实例有限布尔,其中
元素=[假,真]
实例有限字节,其中
元素=…--带字节和元素
如果您填写
,则根据我们为
Nibble
定义的方式,您可以使用和。要构造
字节的所有值的列表

例如,如果您创建一个数据类型
Nibble

data Nibble = Nibble Bool Bool Bool Bool
您可以使用
Nibble[False,True][False,True][False,True][False,True][False,True][False,True]
获取所有可能的
Nibble
列表。因此,这将是
[Nibble-False-False,Nibble-False-False-True,…,Nibble-True-True]

如果因此使
Bool
成为
Finite
的实例,例如,则可以使用
元素
获取
Bool
的值列表,然后定义
字节
的实例:

instance Finite Bool where
    elements = [False, True]

instance Finite Byte where
    elements = …  -- with Byte, <$>, <*> and elements
实例有限布尔,其中
元素=[假,真]
实例有限字节,其中
元素=…--带字节和元素


您根据我们可以为
半字节定义的方式填写
..

提示:
[minBound..maxBound]
给出
。你可以利用
来构造所有可能的
字节
s.@WillemVanOnsem我认为在这种情况下,有一个自定义的
有限的
类和实例,应该使用它来代替
Bool
s。bytepoint::Byte->Int bytepoint(位x7 x6 x5 x4 x3 x2 x1 x0)=和[bitToInt x*2^n](x,n)Int-bitToInt-False=0-bitToInt-True=1(我也有这个;我应该在这里使用它吗?@steve:我认为这不是必要的否。提示:查看(并调整)所有对的实现。
提示:
[minBound..maxBound]
给出了
False
True
。您可以使用
来构造所有可能的
字节
s.@WillemVanOnsem我认为在这种情况下,应该使用为
Bool
定义的自定义
有限
类和实例。bytepoint::Byte->Int bytepoint(位x7 x6 x5 x4 x3 x2 x1 x0)=和[bitToInt x*2^n |(x,n)Int bitToInt False=0 bitToInt True=1(我也有这个;我应该在这里使用它吗?@steve:我认为这没有必要不。提示:查看(并调整)所有对的实现。因此语法是:Elements=Nibble[False,True][False,True][False,True][False,True]??@steve:这是一个
半字节(四位)。你需要将它概括为
字节
。而且这不是语法,
()
()
只是函数。赋值说明,我不能使用True和False构造函数explicitly@steve:但是您不应该自己定义列表。您只需将
半字节…
表达式更改为使用
字节,而不是使用
[False,True]
,你可以使用
元素
。@steve:但它不是
[元素]
而是
元素
,因为
元素
将已经折叠为
[Bool]
…所以语法是:elements=Nibble[False,True][False,True][False,True][False,True]???steve。您需要将其概括为
字节
。此外,这不是语法,
()
()
只是函数。赋值说明,我不能使用True和False构造函数explicitly@steve:但是您不应该自己定义列表。您只需将
半字节…
表达式更改为使用
字节,而不是使用
[False,True]
,您可以使用
元素
@steve:但它不是
[元素]
,而是
元素
,因为
元素
将已经折叠为
[Bool]
。。。