我在 haskell 中建立了一个几何库。我不打算发布它,它只是我用来提高我的语言知识的一个项目。
我有一个Local
数据类型,具有以下定义
data Local a where
MkLocal :: (Vectorise a) => ReferenceFrame -> a -> Local a
参考框架是指向框架原点的向量和表示框架旋转的角度,两者都定义为“绝对”参考框架(嘿,这不是现实世界!)。Vectorise
几何是一种具有可逆变换为 的列表的几何Vector
。
我突然想到 Local 可能是以下实例Functor
:
instance Functor Local where
fmap f geom = localise (frame geom) (f $ local geom)
但是编译器抱怨没有 Vectorisable 的实例用于定义中的 localize 。有没有办法使用无数 GHC 扩展之一来解决这个限制?
编辑:根据评论中的要求,这里是一些使用的类型
local :: Local a -> a
frame :: Local a -> ReferenceFrame
localise :: (Vectorise a) => ReferenceFrame -> a -> Local a
错误是
No instance for (Vectorise b)
arising from a use of `localise'
In the expression:
localise (frame geom) (f $ local geom)
In an equation for `fmap':
fmap f lgeom = localise (frame geom) (f $ local geom))
In the instance declaration for `Functor Local'
这是有道理的,因为 for 的类型fmap
是(a -> b) -> f a -> f b
. 它可以推断出它a
必须是 的一个实例Vectorise
,但我想知道它如何推断出它b
,除非我可以指定(以某种方式)我可以告诉编译器f
必须具有受限的返回类型,而无需定义另一个类型类,而已经有一个几乎已经符合要求(或者,如果有人可以帮助解释为什么以这种方式限制类会以某种方式破坏类型推断)。
附言。我还修正了我在定义中颠倒local
和颠倒的错字frame
fmap