2014-04-12 32 views
5

Cú pháp dấu chấm bằng (.=) và dấu hai chấm (.:) có nghĩa là gì trong ví dụ này được lấy từ thư viện JSON Aeson?Cú pháp dấu chấm và dấu chấm có nghĩa là gì trong Haskell?

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 

Ví dụ đầy đủ trên Github: https://github.com/bos/aeson/blob/master/examples/Simplest.hs

+5

Chúng là các hàm từ thư viện 'aeson'. Xem phần này để biết thêm chi tiết: http://hackage.haskell.org/package/aeson-0.7.0.3/docs/Data-Aeson.html – Sibi

+4

Hoogle biết. ['(.:)'] (http://www.haskell.org/hoogle/?hoogle=.%3A+%2Baeson) và ['(. =)'] (http://www.haskell.org/ hoogle /? hoogle =.% 3D +% 2Baeson) – hammar

+5

Nói chung, các toán tử không thực sự là "cú pháp" trong Haskell. Với rất ít ngoại lệ, chúng chỉ được định nghĩa trong thư viện. – kosmikus

Trả lời

8

Các ý kiến ​​đều đúng. Bạn có thể Hoogle cho các chức năng này và tìm tài liệu haddock chính xác, cho thấy các toán tử này là các hàm được định nghĩa trong một thư viện và không phải là một phần không thể thiếu của ngôn ngữ Haskell. Nói chung, một bắt đầu . được sử dụng bởi các thư viện để xác định các hàm infix vì nhiều biểu tượng mong muốn khác không hợp lệ cho các hàm (ví dụ: :.) hoặc ký tự số ít được đặt trước trong Haskell (ví dụ: =, :).

(.=) được sử dụng để giúp tạo đối tượng JSON trong khi .: là để phân tích cú pháp JSON. Thông thường với Aeson bạn có một trận đấu một-một giữa một số cấu trúc dữ liệu và một số thiết lập các thông điệp JSON, vì vậy ví dụ:

{-# 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 

Bây giờ bạn có thể tải module này trong GHCi và chơi xung quanh một cách dễ dàng:

*Main> testJSON 
Object fromList [("msg",String "Hello user3526171"),("msgId",Number 398242.0)] 
*Main> testParse 
Success (ServerMsg {msgId = 398242, msg = "Hello user3526171"}) 
Các vấn đề liên quan