简单的GHC.Generics示例
我正试图创建一个关于如何使用GHC.Generics的最小工作示例,方法如下。以下是我所拥有的:简单的GHC.Generics示例,generics,haskell,Generics,Haskell,我正试图创建一个关于如何使用GHC.Generics的最小工作示例,方法如下。以下是我所拥有的: {-# LANGUAGE DefaultSignatures, DeriveGeneric, TypeOperators, FlexibleContexts #-} import GHC.Generics data Bit = O | I deriving Show class Serialize a where put :: a -> [Bit] default put ::
{-# LANGUAGE DefaultSignatures, DeriveGeneric, TypeOperators, FlexibleContexts #-}
import GHC.Generics
data Bit = O | I deriving Show
class Serialize a where
put :: a -> [Bit]
default put :: (Generic a, GSerialize (Rep a)) => a -> [Bit]
put a = gput (from a)
class GSerialize f where
gput :: f a -> [Bit]
instance GSerialize U1 where
gput U1 = []
instance (GSerialize a, GSerialize b) => GSerialize (a :*: b) where
gput (a :*: b) = gput a ++ gput b
instance (GSerialize a, GSerialize b) => GSerialize (a :+: b) where
gput (L1 x) = O : gput x
gput (R1 x) = I : gput x
instance (GSerialize a) => GSerialize (M1 i c a) where
gput (M1 x) = gput x
instance (Serialize a) => GSerialize (K1 i a) where
gput (K1 x) = put x
--
-- Try it out...
--
data UserTree a = Node a (UserTree a) (UserTree a) | Leaf
deriving Generic
instance (Serialize a) => Serialize (UserTree a)
instance Serialize Int
main = do
print . put $ (Leaf :: UserTree Int)
print . put $ (Node 7 Leaf Leaf :: UserTree Int)
print . put $ (3 :: Int)
但是,当我尝试运行此程序时,程序挂起:
λ> main
[I]
[O -- the program hangs here
我做错了什么?您需要一个适当的
Int
实例。这是一种内置类型,你不能指望这里有魔力。为Int
提供一个空实例将导致循环(这可以说是一个糟糕的设计决策,但目前就是这样)
这里有一个有效的方法(但没有效率):
如果您确实想要一个最小的示例,那么不要使用Int
,而是使用Tree()
或Tree Bool
import Data.Bits
boolToBit :: Bool -> Bit
boolToBit False = O
boolToBit True = I
instance Serialize Int where
put x = map (boolToBit . testBit x) [0 .. bitSize x - 1]