Docela by mě zajímalo, jak se v haskellu zpracovávají "nějaká data". Jak bys například přepsal tohle?
import requests
ua = requests.get(r'http://headers.jsontest.com/').json().get('User-Agent', '')
{-# LANGUAGE OverloadedStrings #-}
import Network.Wreq (get, responseBody)
import Control.Lens ((^?), (<&>), preview)
import Data.Aeson.Lens (key)
main = do
r <- get "http://headers.jsontest.com"
let ua = r ^? responseBody . key "User-Agent"
print r
Takhle to kompletně funguje a takhle bych to napsal. Kromě těch importů v podstatě totéž.
Aby to byl one-liner, tak se to dá pořešit třeba tímhle:
r <- get "http://headers.jsontest.com" <&> preview (responseBody . key "User-Agent")
A výstup:
Just (String "haskell wreq-0.4.1.0")
Pokud by došlo k chybě dekódování nebo tam ten klíč chyběl, tak by z toho vypadlo Nothing. Pokud bys vyloženě chtěl, aby tam byl prázdný string, tak by se přidalo (<&> fromMaybe "").
BTW: responseBody ukazuje na ByteString, "key" je polymorfní lens, která na bytestringu funguje tak, že rovnou provede JSON dekódování; někdo se tu ptal, jak funguje setter - tak vzhledem k tomu, že tohle je lens, tak je možné provádět i updaty:
> "[1,2,3]" & val . _Number %~ (+1)
"[2,3,4]"
> "[1,2,3]" & nth 1 . _Number %~ (+10)
"[1,12,3]"
Tzn. automaticky se to překonvertuje zpátky do stringu. Jako tohle v praxi asi moc užitečné není, ale je to docela zajímavé, co všechno je možné zrovna s lensama dělat
