Haskell中任意JSON对象的密钥访问

Wil*_*hes 0 haskell

我有以下代码:

import Text.JSON

-- get the value in a JSON object that has this key
getByKey :: JSValue -> String -> Maybe JSValue
getByKey object key =
  case object of
    JSObject a ->
      getFirst keyValues keyMatches
      where keyValues = fromJSObject object
            keyMatches (key', value) = key == key'
    _ -> Nothing

-- get the first item in the list matching a predicate
getFirst :: [a] -> (a -> Bool) -> Maybe a
getFirst [] pred = Nothing
getFirst (x:xs) pred =
  case pred x of
    True -> Just x
    False -> getFirst xs pred
Run Code Online (Sandbox Code Playgroud)

我想用它来访问任意JSValue中的值.但是,它不编译:

Prelude> :load Example
[1 of 1] Compiling Main             ( Example.hs, interpreted )

Example.hs:8:26:
    Couldn't match expected type `JSValue'
                with actual type `(String, t0)'
    Expected type: JSValue -> Bool
      Actual type: (String, t0) -> Bool
    In the second argument of `getFirst', namely `keyMatches'
    In the expression: getFirst keyValues keyMatches

Example.hs:9:38:
    Couldn't match expected type `JSObject e0'
                with actual type `JSValue'
    In the first argument of `fromJSObject', namely `object'
    In the expression: fromJSObject object
    In an equation for `keyValues': keyValues = fromJSObject object
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

编辑:Daniel Fischer善意地指出fromJSObject object应该是fromJSObject a.但是,这还不足以使类型检查器满意:

[1 of 1] Compiling Main             ( Example.hs, interpreted )

Example.hs:8:16:
    Couldn't match expected type `JSValue'
                with actual type `(String, JSValue)'
    Expected type: [JSValue]
      Actual type: [(String, JSValue)]
    In the first argument of `getFirst', namely `keyValues'
    In the expression: getFirst keyValues keyMatches
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

ham*_*mar 5

为什么不简单地使用lookupPrelude中的现有功能?

getByKey :: JSValue -> String -> Maybe JSValue
getByKey (JSObject obj) key = lookup key (fromJSObject obj)
getByKey _ _ = Nothing
Run Code Online (Sandbox Code Playgroud)

此外,您的getFirst函数是Data.List.find(参数顺序相反).