如何`实例FromJSON a => FromJSON(实体a)`在Haskell工作?

时间:2014-11-02 04:48:44

标签: haskell

我是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}}是什么意思?

如果这有帮助的话,我可以把它分成多个问题,但这一切似乎都是互相关联的。

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}}