Haskell有限字节
我正在使用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
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]
。。。