Haskell类型类别名和模块重新导出
我现在正在努力学习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 (
{-#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
后面的东西实际上必须是您要为其编写实例的类的名称。