我开始对 GHC 7.4.2 中的新类约束扩展感到困惑,但我在让一个小例子工作时遇到了一些问题。代码如下:
{-# LANGUAGE UndecidableInstances,
MultiParamTypeClasses,
KindSignatures,
TypeFamilies,
Rank2Types,
ConstraintKinds,
FlexibleInstances,
OverlappingInstances #-}
module Test where
import GHC.Exts -- to get Constraint type constructor
class NextClass f where
type Ctxt f a :: Constraint
next :: (Ctxt f a) => a -> a
instance NextClass Int where
type Ctxt Int a = Num a
next b = b + 1
n :: (NextClass a) => a -> a
n v = next v
我想要做的是定义一个NextClass
类型类,这将允许我(给定一个值 x)为所有类型的实例获取 x 的下一个值NextClass
。要使用+
运算符,我Num a
需要Int
.
但是,GHC 给了我以下错误:
Could not deduce (Ctxt f0 a) arising from a use of `next'
from the context (NextClass a)
bound by the type signature for n :: NextClass a => a -> a
In the expression: next v
In an equation for `n': n v = next v
我怀疑 GHC 告诉我它没有足够的信息来确定要使用哪个约束族实例。
有人可以解释我在这里做错了什么。这是对约束族的正确使用吗?
TIA