gpt4 book ai didi

haskell - 如何定义类型类同义词

转载 作者:行者123 更新时间:2023-12-04 08:25:16 24 4
gpt4 key购买 nike

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

最佳答案

you have to fully qualify



不,不完全符合条件。考虑:
import qualified Algebra.Additive as Add

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

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

编辑:

还可以考虑创建一个父类(super class)并将其视为别名:
class (Add.C a, Ring.C a) => Num a where
instance Num Int
instance Num Word

关于haskell - 如何定义类型类同义词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24330405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com