我有这个:
(Aeson.Object jsonObject) -> case (HashMap.lookup "high" jsonObject, HashMap.lookup "low" jsonObject) of
(Just (String val), Just (String val2)) -> [val, val2]
_ -> error "Couldn't get both keys"
我希望能够通过" high"和"低"作为参数并对它们进行模式匹配以从Json检索它们的实际值。当然,这些论点的数量可能会有所不同。
parseJson :: [String] -> [String]
parseJson keys =
(Aeson.Object jsonObject) -> case (?????) of
(?????) -> ????
_ -> error "Couldn't retrieve the keys"
我该怎么做?
答案 0 :(得分:3)
尝试这样的事情。我假设(AesonObject.jsonObject)
指的是现有案例表达的情况,因为它在语法上无效。
import Control.Monad ( sequence )
getString (Just (String value)) = Just value
getString _ = Nothing
parseJson :: [String] -> [String]
parseJson keys =
case ... of
(Aeson.Object jsonObject) ->
case sequence (map (getString . flip HashMap.lookup jsonObject) keys) of
Just values -> values
_ -> error "Couldn't retrieve the keys"
flip HashMap.lookup jsonObject
为您提供了从键到值的查找功能(Maybe
。使用getString
进行组合会为我们提供仅在String
值上成功的内容,就像你现有的内联模式匹配一样。
最后,Maybe
monad上的sequence
将[Maybe String]
变为Maybe [String]
,如果输入的所有元素都是Just
,则只返回Just
{{1}}。