传递不同数量的参数

时间:2014-06-22 16:42:58

标签: haskell

我有这个:

(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"

我该怎么做?

1 个答案:

答案 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}}。