Ich versuche, einen Wrapper um ffprobe
zu schreiben, der value
in JSON des Formats {"format": {"format_name": value}}
extrahiert. Der JSON wird von einem erstellten Prozess ausgegeben. Hier ist, was ich erreicht habe.Extrahieren von Daten mit 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
Es irgendwie zu kompilieren:
[1 of 1] Compiling Main (ffprobe.hs, ffprobe.o)
ffprobe.hs:20:59: error:
Variable not in scope: format :: JSObject JSValue
ich über einige Dinge bin verwirrt, einschließlich, warum kann ich nicht die letzte Zeile zu kompilieren:
- Warum kann‘ t Ich bestätige für
Ok
in derResult
nach der::
. Wie:: Result Ok JSObject JSValue
? - Warum kann ich die Werte in einer Where-Klausel nicht extrahieren?
- Warum ist es
Result (JSObject (JSValue))
und nichtResult JSObject JSValue
? - Warum ist
format
außerhalb des Geltungsbereichs?
Ich habe das Gefühl, ich bin die IO-und Ergebnis-Monaden zusammen in der gleichen do
Block oder etwas mischen. Ist Result
sogar eine Monade? Kann ich den gewünschten Wert in einem separaten do
extrahieren, ohne über die ganze IO
do
zu schreiten?
Wenn Sie nur JSON dekodieren möchten, wissen Sie, dass es eine bekannte Haskell-Bibliothek namens ['aeson'] gibt (https://hackage.haskell.org/package/aeson-0.11.2.0/ docs/Daten-Aeson.html)? – Alec