在Haskell中,点等号和点冒号语法是什么意思?

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


6
这些是来自 aeson 库的函数。欲了解更多详细信息,请查看此链接:http://hackage.haskell.org/package/aeson-0.7.0.3/docs/Data-Aeson.html - Sibi
6
Hoogle知道。(.:)(.=) - hammar
6
通常情况下,操作符在 Haskell 中并不是真正的 "语法"。除了极少数例外,它们只是在库中被定义。 - kosmikus
1个回答

11
所有评论都是正确的。你可以使用Hoogle查找这些函数并找到正确的Haddock文档,它显示这些运算符是库中定义的函数,而不是Haskell语言的某个组成部分。通常,库使用起始点“.”来定义中缀函数,因为许多其他理想的符号既无效用于函数(例如“:.”),又是Haskell中保留的语法单字符(例如“=”、“:”)。
“.=”用于帮助创建JSON对象,而“.:”用于解析JSON。通常情况下,在Aeson中,您拥有某些数据结构和一些JSON消息之间的一对一匹配,例如:
{-# 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

现在你可以在GHCi中加载这个模块并轻松地玩耍:

*Main> testJSON
Object fromList [("msg",String "Hello user3526171"),("msgId",Number 398242.0)]
*Main> testParse 
Success (ServerMsg {msgId = 398242, msg = "Hello user3526171"})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接