【问题标题】:How to Define Typeclass Synonyms如何定义类型类同义词
【发布时间】:2014-06-20 15:10:26
【问题描述】:

为了尝试替代 Haskell 的数字类型系统,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 设为type 与类型Constraint 同义,我真正 喜欢定义一个typeclass 类型类Algebra.Additive.C 的同义词。在 GHC 7.8 中有什么方法可以做到这一点,还是有任何明智的选择?

【问题讨论】:

  • 让我们具体一点。只有 Henning Thielemann 将他的所有类型命名为 T,并将他的所有类命名为 C。其他人都知道这很糟糕。
  • 知道这很可怕吗?我可以试着说服他……
  • 也许有人应该分叉numeric-prelude 来修复名称
  • 它也不会在 Hackage 上正确显示,如果很多人想要看起来像这样的实例列表,我会感到惊讶:hackage.haskell.org/package/numeric-prelude-0.4.0.3/docs/…
  • @DavidYoung 这些实例正是我要使文档不可读的意思。不得不将鼠标悬停在超链接上并查看地址以读取约束是非常令人沮丧的。

标签: haskell ghc typeclass


【解决方案1】:

你必须完全符合条件

不,不完全符合条件。考虑:

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

【讨论】:

  • 是的,我发帖后意识到可以缩短资格,谢谢指出。虽然我不需要将类组合成一个新类,但使用新类比我的ConstraintKinds 解决方案有什么优势吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多