我正在编写一个程序来表示有限群和对其元素的简单操作。我编写了我需要的大部分功能,例如逆元素、生成器、检查子集是否是子组等。
不幸的是,我所有的功能都需要标识元素、集合和操作。我想定义类的适当实例并使用它而不是这个三重奏。我的问题从这里开始,我不太清楚该怎么做,我在互联网上可以找到的所有内容仅包含定义示例,没有使用示例。
最终我想与组合作Sn
,到目前为止,我已经在 ( Zn +
) 上测试了我的代码。
我写了这个:
data Z2 = Elm Int deriving (Show, Eq)
z2 :: Int -> Z2
z2 a = Elm (a `mod` 2)
class FiniteGroup a where
identity :: a
op :: a -> a -> a -- operation
set :: [a]
instance FiniteGroup Z2 where
identity = (Elm 0)
op (Elm x) (Elm y) = z2 (x+y)
set = [(Elm 0), (Elm 1)]
它适用于 function op
,例如:
*Main> (Elm 1) `op` (Elm 0)
Elm 1
不幸的是,我不能使用identity
and set
。我该如何使用它?
我也不知道如何重构现有函数以使用我的类型类。
例如我有这个:
cyclicGenerators :: (Eq a) => a -> [a] -> (a -> a -> a) -> [a]
它工作正常,但我想要这样的东西:
cyclicGenerators :: (Eq a) => FiniteGroup a -> [a]