有一个返回的函数:
>>> ["Just (Number 8000.0)","Just (Number 93.0)","Just (String \"test\")"]
获得价值观的最佳方法是什么?
>>> ["8000.0", "93.0", "test"]
代码正试图使用Aeson的prism
来解析JSON。
代码
jsonFile :: FilePath
jsonFile = "test.json"
getJSON :: IO BS.ByteString
getJSON = BS.readFile jsonFile
main :: IO ()
main = do
input <- getJSON
print $ f input
f :: BS.ByteString -> [String]
f x = [ show $ (x ^? key "a" . nth 0 . key "b")
, show $ x ^? key "a" . nth 0 . key "c"
, show $ x ^? key "a" . nth 0 . key "d"
]
答案 0 :(得分:8)
Data.Maybe
的 catMaybes只会在列表中留下Just
个值,并放弃任何Nothing
个。
(提示:您可以使用Hoogle搜索[Maybe a] -> [a])。
更新:如果您想用其他内容替换Nothing
,请使用fromMaybe和您的默认值,即
map (fromMaybe "Nothing") (f x)
看起来你在列表中有字符串而不是Maybe
;您必须从每个元素中移除show
来电。
再次更新:让我们将所有内容转换为字符串!
map (fromMaybe "nothing" . fmap show)
外部map
将转换应用于每个元素。 fmap show
会将Just
内的值转换为字符串并单独留下Nothing
(请注意将1
转换为字符串"1"
:
> map (fmap show) [Just 1, Nothing]
[Just "1",Nothing]
然后fromMaybe "nothing"
解包Just
个值,并用您选择的字符串替换Nothing
。
> map (fromMaybe "nothing" . fmap show) [Just 1, Nothing]
["1","nothing"]
我建议您在使用Haskell时更密切关注类型,将所有内容转换为字符串会消除使用类型良好的语言的好处。