我是Haskell的新手。我正在尝试创建一个简单的JSON API客户端,并找到一个implemented for Twitter in Haskell。我目前的目标在this question中有所概述,但同样的事情如下所示。
在那个Twitter / Haskell API代码中,有这个片段:
https://github.com/himura/twitter-types/blob/master/Web/Twitter/Types.hs#L577-L587
type EntityIndices = [Int]
data Entity a = Entity {
entityBody :: a, -- ^ The detail information of the specific entity types (HashTag, URL, User)
entityIndices :: EntityIndices, -- ^ The character positions the Entity was extracted from
} deriving (Show, Eq)
instance FromJSON a => FromJSON (Entity a) where
parseJSON v@(Object o) = Entity <$> parseJSON v
<*> o .: "indices"
parseJSON _ = mzero
这里发生了什么?
首先,根据我的理解,data
阻止是Generalized Algebraic Data Type,因为您正在将参数传递到data Entity a
类型,而a
正在使用entityBody :: a
Entity
。
其次,如何实例化instance FromJSON a => FromJSON (Entity a) where
广义代数数据类型?
最后,这里发生了什么?
=>
{{1}}是什么意思?
如果这有帮助的话,我可以把它分成多个问题,但这一切似乎都是互相关联的。
答案 0 :(得分:2)
Entity
data Entity a = Entity {
entityBody :: a, -- ^ The detail information of the specific entity types (HashTag, URL, User)
entityIndices :: EntityIndices, -- ^ The character positions the Entity was extracted from
} deriving (Show, Eq)
a
可以是任何类型。没有限制。 FromJSON
Entity
的实例限制a
的类型。这是FromJSON
Entity
a
FromJSON
类型的实例,也必须定义show
个实例。
例如show :: Show a => a -> String
类型类。
show
为了调用a
函数,Show
中传递的参数必须具有=>
的实例。 FromJSON
只是分隔类型定义的类型类约束。
回到data Person = Person { name :: String }
。如果您定义自己的数据类型。
let e = eitherDecode data :: Either String (Entity Person)
并编写代码
FromJSON
它不会编译,因为您还没有为Person
定义instance FromJSON Person where
parseJSON (Object o) = Person <$> o .: "name"
parseJSON _ = mzero
的实例。如果您创建实例,那么它将起作用。
{{1}}