作为一种自我分配的练习,我正在努力实现基于代数的数字类型层次。
我想指出,如果一个结构可以以规范的方式被视为满足我的一个类型类的东西,那么它也应该是该类型类的一个实例。为此,我基本上尝试了以下方法:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
FlexibleContexts, FlexibleInstances #-}
class AbGp s a where
plus :: a -> a -> s -> a
zero :: s -> a
minus :: a -> a -> s -> a
class View a b c | a c -> b
view :: a -> b
instance (View s s1 a, AbGp s1 a) => AbGp s a
plus x y s = plus x y (view s)
zero = zero . view
minus x y s = minus x y (view s)
s
应该被视为持有组中操作的定义,a
作为组中元素的类型。
但这不起作用,这并不令人惊讶,但我现在要做的是:
假设我知道某些类型s
,比如表示s
的{{1}},可以规范地映射到Ring
,这是一个数据结构我已经有一个实例作为{ {1}},然后我希望s1
也自动成为AbGp
的实例。我怎么能这样做?
我想要做以下事情,如果它可以工作,但我想知道是否有更好的方法:
s