为了使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中有没有办法做到这一点,还是有任何理智的选择?
我们是具体的。只有Henning Thielemann将他的所有类型'T'和他的所有类'C'命名。其他人都知道这很糟糕。 – Carl
他*知道这很糟糕吗?我可以尝试说服他... – crockeea
@Eric:不要打扰。他认为这是有史以来最好的事情。 –