2016-06-25 3 views
0

Что такое эквивалент эзона для доступа к атрибуту javascript.Свойства запроса объекта

Как бы вы переводили описание javascript x.a.b в Haskell?

В качестве примера рассмотрим someObject :: Object содержащий например:

{ a: 
    { b: 
    [ 1 
    , 2 
    ] 
    } 
} 

Что бы функция, которая возвращает [1,2] для вышеприведенного выглядеть.

Я искал ответ на эту проблему, и, похоже, ответ на этот вопрос будет «использовать линзы». Я просто не могу понять, как это сделать.

+0

обновил свой ответ с раствором линзы. – ErikR

ответ

1

Вот решение линзы:

{-# LANGUAGE OverloadedStrings #-} 

import Data.Text 
import Data.Aeson 
import Data.Aeson.Lens 
import Control.Lens 

Just obj1 = decode ("{ \"a\": { \"b\": [ 3,4,5] } }") :: Maybe Value 
Just obj2 = decode ("{ \"a\": { \"d\": true } }") :: Maybe Value 

test1 = (Just obj1) ^. (key "a") ^. (key "b") :: Maybe Value 
test2 = (Just obj2) ^. (key "a") ^. (key "b") :: Maybe Value 

Обратите внимание, что вы должны начать цепочку с Maybe Value.

Вот без линзы ответ, если это помогает:

{-# LANGUAGE OverloadedStrings #-} 

import Data.Aeson 
import qualified Data.HashMap.Strict as HM 

-- access .a.b 
get_a_b :: Object -> Maybe Value 
get_a_b hm = do 
    v <- HM.lookup "a" hm 
    hm2 <- case v of 
      (Object hm2) -> return hm2 
      _   -> Nothing 
    HM.lookup "b" hm2 
Смежные вопросы