我有一个数据类型,我通过ghc 7.4.1中的DataKinds和我想用来进行类型特定操作的给定类型类提升.
data Type = TInt32 | TInt64 | TInt16
class TypeTraits a where
...
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建提升类型的类型类实例,如下所示:
instance TypeTraits TInt32 where
...
Run Code Online (Sandbox Code Playgroud)
我收到以下类型的错误:
Kind mis-match
The first argument of `TypeTraits' should have kind `*',
but `TInt32' has kind `Type'
In the instance declaration for `TypeTraits TInt32'
Run Code Online (Sandbox Code Playgroud)
尝试通过指定'a'的类型来解决这个问题:
class TypeTraits (a :: Type) where
...
Kind mis-match
Expected kind `ArgKind', but `a' has kind `Type'
In the type `a -> String'
In the class declaration for `TypeTraits'
Run Code Online (Sandbox Code Playgroud) 我正在尝试为无方向边创建数据类型的实例.边缘1 2 ==边缘2 1(即边缘从1到2与边缘从2到1相同,方向无关紧要).
以下是数据类型,Eq实例和Ord实例尝试的示例:
data Edge = Edge Int Int deriving Show
instance Eq Edge where
(Edge x1 y1) == (Edge x2 y2) = ((x1 == x2 && y1 == y2) || (x1 == y2 && y1 == x2))
instance Ord Edge where
compare e1@(Edge x1 y1) e2@(Edge x2 y2) = if e1 == e2
then EQ
else ????
Run Code Online (Sandbox Code Playgroud)
知道在这种情况下如何获得完全有序的 Ord实例吗?
我试图使用类型类和函数依赖得到一个类型的功能,可以改变发言权,Int 以Cont Int在下面的代码,然后用它在其他类型类,如下图所示.
{-# LANGUAGE KindSignatures, FunctionalDependencies, FlexibleInstances, FlexibleContexts #-}
newtype TestData a b = TestData b
newtype Cont a = Cont a
class TypeConv (repr :: * -> *) a b | repr a -> b where
class Lift repr a where
liftOp :: (TypeConv repr a a') => a -> repr a'
instance TypeConv (TestData a) Int (Cont Int) where
instance Lift (TestData a) Int where
liftOp i = TestData (Cont i)
Run Code Online (Sandbox Code Playgroud)
这是来自ghci …