在Haskell中,点等于什么,点冒号语法意味着什么?

时间:2014-04-12 07:13:53

标签: haskell

此示例中的点等于(.=)和点冒号(.:)语法在Aeson JSON库中的含义是什么?

instance ToJSON Coord where
  toJSON (Coord xV yV) = object [ "x" .= xV,
                              "y" .= yV ]

-- A FromJSON instance allows us to decode a value from JSON.  This
-- should match the format used by the ToJSON instance.

instance FromJSON Coord where
  parseJSON (Object v) = Coord <$>
                         v .: "x" <*>
                         v .: "y"
  parseJSON _          = empty

Github上的完整示例:https://github.com/bos/aeson/blob/master/examples/Simplest.hs

1 个答案:

答案 0 :(得分:8)

评论都是正确的。您可以使用Hoogle来获取这些函数,并找到正确的haddock文档,其中显示这些运算符是库中定义的函数,而不是Haskell语言的一部分。通常,库使用起始.来定义中缀函数,因为许多其他所需符号对函数无效(ex :.)或单数字符是Haskell中的保留语法(ex {{1 },=)。

:用于帮助创建JSON对象,而(.=)用于解析JSON。通常使用Aeson,您可以在某些数据结构和一些JSON消息集之间进行一对一匹配,例如:

.:

现在您可以在GHCi中加载此模块并轻松玩耍:

{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Text
import Control.Applicative ((<$>), (<*>))
import Control.Monad (mzero)
data ServerMsg = ServerMsg.
                   { msgId :: Int
                   , msg   :: Text
                   } deriving (Show)
instance ToJSON ServerMsg where
    toJSON d = object [ "msgId" .= msgId d
                      , "msg"   .= msg d
                      ]
instance FromJSON ServerMsg where
    parseJSON (Object o) =
              ServerMsg <$> o .: "msgId" <*> o .: "msg"
    parseJSON _ = mzero    


testJSON :: Value
testJSON = toJSON (ServerMsg 398242 "Hello user3526171")

testParse :: Result ServerMsg
testParse = fromJSON testJSON