沒有完全標準的類來做到這一點,但自己做一個很容易。我就勾勒這樣做的一種方法:
data P = A | B Q deriving Show
data Q = C | D R | E deriving Show
data R = F | G deriving Show
class Finite a where
allValues :: [a]
instance Finite P where
allValues = [A] ++ map B allValues
instance Finite Q where
allValues = [C] ++ map D allValues ++ [E]
instance Finite R where
allValues = [F] ++ [G]
我寫的情況下,這種方式表明,它很容易和機械,並且可以通過程序來實現(例如,使用泛型編程或模板哈斯克爾) 。您還可以添加一個實例做一些跑腿的你,所提供的類型爲Bounded
和Enum
erable:
instance (Bounded a, Enum a) => Finite a where
allValues = [minBound..maxBound]
如果你現在添加deriving (Bounded, Show)
到R
,這是一個少寫實例!
不管怎樣,現在我們可以評估allValues :: [P]
並取回[A,B C,B (D F),B (D G),B E]
- 然後你就可以用zip
[0..]
讓你的編碼等。
但是這肯定是以前做過的!我沒有使用過多的序列化(如果有的話),但快速搜索顯示the binary package和the binary-derive package可以爲您做類似的事情,而無需親自編寫實例。我會看看那些人是否會先做你想做的事。