小编Che*_*tan的帖子

如何创建提升类型的类型类实例?

我有一个数据类型,我通过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)

haskell typeclass

6
推荐指数
1
解决办法
558
查看次数

完全有序的Ord实例用于无方向边缘?

我正在尝试为无方向边创建数据类型的实例.边缘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实例吗?

haskell

3
推荐指数
1
解决办法
145
查看次数

Haskell:为什么GHC不使用fundeps来推断这个类型类中的类型?

我试图使用类型类和函数依赖得到一个类型的功能,可以改变发言权,IntCont 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 …

haskell typeclass functional-dependencies

2
推荐指数
1
解决办法
248
查看次数