我正在为我编写的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.
我应该做些什么?
谢谢!
答案 0 :(得分:7)
问题在于APIObject
,您的构造函数为Bookmark
和Note
,但这些也是Bookmark
和Note
数据类型的构造函数!相反,你可以做类似
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
所以你想要做的就是同构(同样)。