2014-06-20 54 views
8

为了使Haskell的数字类型系统变得理智(r)替代,numeric-prelude的开发人员滑落并决定命名其所有类型类别C。除了使文档完全混乱,这意味着我必须要完全限定的类型类的所有用途:如何定义类型同义词

import qualified Algebra.Additive (C) 
import qualified Algebra.Ring (C) 
... 

newtype Foo a = Foo a 

instance (Algebra.Additive.C a) => Algebra.Additive.C (Foo a) where ... 

myadd :: (Algebra.Additive.C a) => a -> a -> a 
myadd a b = ... 

而且,由于NumericPrelude拥有细粒度的类型类,我通常要导入多个不同NumericPrelude模块。

{-# LANGUAGE ConstraintKinds #-} 

module NPSynonyms (Additive) where 

import qualified Algebra.Additive (C) 

type Additive a = (Algebra.Additive.C a) 

,让我做出理智的功能:我可以通过定义顶级约束同义词简化这一点

myadd :: (Additive a) => a -> a -> a 
myadd a b = ... 

然而,当我需要定义一个实例,我还是有(也)进口原装NumericPrelude类:

{-# LANGUAGE ConstraintKinds #-} 

import NPSynonyms 
import Algebra.Additive (C) 

newtype Foo a = Foo a 

instance (Additive a) => Algebra.Additive.C (Foo a) where ... 

因此,而不是做一个Additive类型同类别Constraint,我会真的类似于定义一个类型类类型类的同义词。在GHC 7.8中有没有办法做到这一点,还是有任何理智的选择?

+10

我们是具体的。只有Henning Thielemann将他的所有类型'T'和他的所有类'C'命名。其他人都知道这很糟糕。 – Carl

+1

他*知道这很糟糕吗?我可以尝试说服他... – crockeea

+0

@Eric:不要打扰。他认为这是有史以来最好的事情。 –

回答

5

你必须完全限定

不,不完全限定。考虑:

import qualified Algebra.Additive as Add 

myadd :: Add.C a => a -> a -> a 

这对我来说看起来相当可读。

编辑:

而且考虑制定超和治疗,作为一个别名:

class (Add.C a, Ring.C a) => Num a where 
instance Num Int 
instance Num Word 
+0

是的,我意识到我可以在发布后缩短资格,谢谢指出。虽然我没有必要将类组合成一个新类,但是使用一个新类来解决'ConstraintKinds'的解决方案是否有优势? – crockeea

+0

我现在没有想到。 –