2016-07-08 9 views
1

{"format": {"format_name": value}}のJSONでvalueを抽出するffprobeのラッパーを記述しようとしています。 JSONは、作成されたプロセスによって出力されます。ここに私が何を得たのです。Text.JSONを使用したデータの抽出

import System.Process 
import System.Environment 
import System.IO 
import Text.JSON 

main = do 
    args <- getArgs 
    (_, Just out, _, p) <- createProcess 
     (proc "ffprobe" [args!!0, "-of", "json", "-show_format"]) 
     { std_out = CreatePipe } 
    s <- hGetContents out 
    --putStrLn $ show (decode s :: Result JSValue) 
    --waitForProcess p 
    --putStrLn $ valFromObj "format_name" format 
    -- where format = valFromObj "format" rootObj 
    --   (Ok rootObj) = decode s :: Result (JSObject (JSValue)) 
    let (Ok rootObj) = decode s :: Result (JSObject (JSValue)) 
    let (Ok format) = valFromObj "format" rootObj :: Result (JSObject (JSValue)) 
    putStrLn format_name 
     where (Ok format_name) = valFromObj "format_name" format 
それはとコンパイルに失敗し

:私はコンパイルする最後の行を取得することができない理由を含むいくつかのこと、について困惑している

[1 of 1] Compiling Main    (ffprobe.hs, ffprobe.o) 

ffprobe.hs:20:59: error: 
    Variable not in scope: format :: JSObject JSValue 

  1. なぜすることができます」私はOkResult::の後に主張します。 :: Result Ok JSObject JSValueのように?
  2. where句で値を抽出できないのはなぜですか?
  3. なぜResult (JSObject (JSValue))で、Result JSObject JSValueではないのですか?
  4. なぜformatが範囲外ですか?

私はIOと結果のモナドを同じブロックdoに混ぜていると感じています。 Resultもモナドですか? IOdoの全部を渡さなくても、私が別にしたい値を抽出できますか?do

+0

JSONをデコードしたい場合は、[aeson']という名前のHaskellライブラリがあることが分かります(https://hackage.haskell.org/package/aeson-0.11.2.0/)。 docs/Data-Aeson.html)? – Alec

答えて

2

あなたのコンパイルエラーは、whereの位置のためだと思います。 whereの範囲がdoの外にあるので、それはformatを認識していない

main = do 
    ... 
    let (Ok format) = valFromObj "format" rootObj :: Result (JSObject (JSValue)) 
    let (Ok format_name) = valFromObj "format_name" format 
    putStrLn format_name 

を試してみてください。

1

あなたはこれを行うことはできません。

main = do 
    let bar = "only visible inside main? " 
    return baz 
    where 
    baz = bar ++ " yes, this will break!" 

これが与える:

test.hs:7:11: 
    Not in scope: ‘bar’ 
    Perhaps you meant ‘baz’ (line 7) 

を関数の引数とは異なり、バインディングがバインディング場所では使用できませんしましょう。 barの上にはbazの使用範囲外です。あなたのコードと比較してください。

関連する問題