Haskell类型类别名和模块重新导出

Haskell类型类别名和模块重新导出,haskell,typeclass,Haskell,Typeclass,我现在正在努力学习Haskell的类型课程。我正在使用语言扩展名{-#language ConstraintKinds#-}为类型类指定一个类型别名 包含类型类的模块如下所示: module Foo.Bar.Class ( C (..) ) where class C a where foo :: a 现在我想隐藏type类的内部定义,并公开type类的一个更受限制的接口: {-# LANGUAGE ConstraintKinds #-} module Foo.Bar where (

我现在正在努力学习Haskell的类型课程。我正在使用语言扩展名
{-#language ConstraintKinds#-}
为类型类指定一个类型别名

包含类型类的模块如下所示:

module Foo.Bar.Class
( C (..)
) where

class C a where
  foo :: a
现在我想隐藏type类的内部定义,并公开type类的一个更受限制的接口:

{-# LANGUAGE ConstraintKinds #-}

module Foo.Bar where
( Class
) where

import qualified Foo.Bar.Class as C


type Class = C
cabal文件将Foo.Bar.Class添加到隐藏的模块列表中,并将Foo.Bar添加到公开的模块列表中

但是当我试图使用这样定义的类型类时,编译器开始抱怨
foo
不是类型类
class
的(可见)函数

我的实例看起来是这样的:

data FooBar = Foo | Bar

instance Class (FooBar -> String) where
  foo Foo = "foo"
  foo Bar = "bar"
在模块导出的
C.foo
的导出后面添加
(..)
,无法帮助我看到
foo
。有人能帮忙吗


提前谢谢

我看到你的代码有几个地方出了问题,但我仍然不确定你到底想实现什么。你想隐藏这个类,但你不想隐藏这个类…?@MathematicalOrchid我不想直接公开它。我想在它周围加一点EDSL,使它有用。类本身需要从外部可见,但我不希望库的用户被迫导入类型类。隐藏类定义所依赖的模块只是为了在项目内部构建我的源代码。我希望这能澄清一点。附言:我对哈斯克尔很陌生,所以请原谅我犯的任何错误。我还不了解Haskell的所有内部结构,“我不想公开它”/“类需要可见”。呃,还是很困惑。你到底想让什么可见?(那么“限定”与此有什么关系?)您不能为类创建别名,只能为类型(显然还有函数)创建别名。类永远不能重命名。如果我是你。。。不要给你所有的类命名
C
!问题解决了。。。(你真的需要开始上课吗?)。第一条评论中解释了GHC行为的技术原因。您应该假设
instance
后面的东西实际上必须是您要为其编写实例的类的名称。