使用data关键字定义类型但获取多个声明错误

时间:2014-08-21 16:46:45

标签: haskell

我正在为我编写的API包装器布置所有数据类型。我想分别创建每个类型,然后将它们组合在一个组中,以便我可以模糊地引用它们。

E.g。

data Bookmark = Bookmark {
  url :: T.Text,
  title :: T.Text
} deriving (Show)

data Note = Note {
  author :: T.Text,
  text :: T.Text
} deriving (Show)

data APIObject = Bookmark | Note

这样,我可以定义如下内容:

retrieveFromAPI :: APIObject a => String -> a

String是一个网址。

然而,当我尝试编译它时,我得到两个错误:

[1 of 1] Compiling Main             ( API.hs, interpreted )

API.hs:28:16:
    Multiple declarations of `Bookmark'
    Declared at: API.hs:22:17
                 API.hs:28:16

API.hs:28:27:
    Multiple declarations of `Note'
    Declared at: API.hs:27:13
                 API.hs:28:27
Failed, modules loaded: none.

我应该做些什么?

谢谢!

1 个答案:

答案 0 :(得分:7)

问题在于APIObject,您的构造函数为BookmarkNote,但这些也是BookmarkNote数据类型的构造函数!相反,你可以做类似

的事情
data APIObject = BM Bookmark | NT Note

现在你有了一个构造函数BM :: Bookmark -> APIObject和一个构造函数NT :: Note -> APIObject


或者,如果您不打算向APIObject添加更多类型,则可以执行

type APIObject = Either Bookmark Note

由于Either被定义为

data Either a b = Left a | Right b

所以你想要做的就是同构(同样)。