如何定义类型类同义词

cro*_*eea 8 haskell typeclass ghc

在尝试以做出理智(R)替代Haskell的数字式系统的开发者数字,前奏下滑并决定命名其所有类型的类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 = ...
Run Code Online (Sandbox Code Playgroud)

此外,由于NumericPrelude具有更细粒度的类型类,我通常必须导入几个不同的NumericPrelude模块.我可以通过定义顶级约束同义词来简化这一点:

{-# LANGUAGE ConstraintKinds #-}

module NPSynonyms (Additive) where

import qualified Algebra.Additive (C)

type Additive a = (Algebra.Additive.C a)
Run Code Online (Sandbox Code Playgroud)

这使我能够做出理智的功能:

myadd :: (Additive a) => a -> a -> a
myadd a b = ...
Run Code Online (Sandbox Code Playgroud)

但是,当我需要定义一个实例时,我仍然必须(也)导入原始的NumericPrelude类:

{-# LANGUAGE ConstraintKinds #-}

import NPSynonyms
import Algebra.Additive (C)

newtype Foo a = Foo a

instance (Additive a) => Algebra.Additive.C (Foo a) where ...
Run Code Online (Sandbox Code Playgroud)

因此,而不是做的Additive一个类型同种异名Constraint,我想真正喜欢的是定义一个类型类的类型类同义词Algebra.Additive.C.在GHC 7.8中有没有办法做到这一点,还是有任何理智的选择?

Tho*_*son 5

你必须完全符合资格

不,不完全符合资格.考虑:

import qualified Algebra.Additive as Add

myadd :: Add.C a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

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

编辑:

还要考虑创建一个超类并将其视为别名:

class (Add.C a, Ring.C a) => Num a where
instance Num Int
instance Num Word
Run Code Online (Sandbox Code Playgroud)