2014-04-12 9 views
5

Cosa significa il punto equivale (.=) e il punto due punti (.:) della sintassi in questo esempio tratto dalla libreria JSON di Aeson?Cosa significa il punto equis e la sintassi del punto dot in 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 

esempio completa su Github: https://github.com/bos/aeson/blob/master/examples/Simplest.hs

+5

Sono funzioni della libreria 'aeson'. Vedi questo per maggiori dettagli: http://hackage.haskell.org/package/aeson-0.7.0.3/docs/Data-Aeson.html – Sibi

+4

Hoogle sa. ['(.:)'] (http://www.haskell.org/hoogle/?hoogle=.%3A+%2Baeson) e ['(. =)'] (http://www.haskell.org/ hoogle /? hoogle =.% 3D +% 2Baeson) – hammar

+5

In generale, gli operatori non sono realmente "sintassi" in Haskell. Con pochissime eccezioni, sono appena definiti nelle librerie. – kosmikus

risposta

8

I commenti sono tutti corretti. Puoi utilizzare Hoogle per queste funzioni e trovare la corretta documentazione dell'eglefino, che mostra che questi operatori sono funzioni definite in una libreria e non parte integrante del linguaggio Haskell. In generale, una libreria . viene utilizzata dalle librerie per definire le funzioni infette poiché molti altri simboli desiderabili non sono validi per le funzioni (ex :.) o il carattere singolare è sintassi riservata in Haskell (ex =, :).

(.=) viene utilizzato per aiutare a creare oggetti JSON mentre .: è per l'analisi di JSON. Normalmente con Aeson si dispone di un one-to-one match tra qualche struttura dati e alcune serie di messaggi JSON, così per esempio:

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

Ora è possibile caricare questo modulo GHCi e giocare facilmente:

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